连续赋值语句是verilog数据流建模的基本语句,用于对线网进行赋值。
这玩意等价门级描述,却是从更高的抽象角度描述电路。
连续赋值语句必须以关键词assign开始。
连续赋值语句有以下几种特点:
举例
//out是线网,in1, in2也是线网
assign out = in1 & in2;
// addr是16位向量线网
// addr1_bits, addr2_bits都是16位向量寄存器
assgin addr[15:0] = addr1_bits[15:0] ^ addr2_bits[15:0];
// 拼接
assign {c_out, sum[3:0]} = a[3:0] + b[3:0] + c_in;
看到这个隐字,就晓得了,肯定缺了什么。
在线网声明的同时,对其进行赋值。线网只能被声明一次,因此隐式连续赋值只能有一次。
// 普通赋值
wire out;
assgin out = in1 & in2;
// 可等价于
wire out = in1 & in2;
同理,既然可以隐掉assgin,那可以隐掉wire吗?
当然也是可以的
// out并未对其做线网声明,仿真器会推断出out是隐式声明的线网
wire in1,in2;
assgin out = in1 & in2;
assgin后面。assgin #10 out = in1 & in2;
in1 & in2的新值,赋值给左边之前,有10个时间单位的延迟,如果在这10个时间单位内,in1 & in2的值又发生了变化,赋值表达式的新值回取in1 & in2的当前值。这种性质就是惯性延迟。
// 隐式连续赋值
wire #10 out = in1 & in2;
// 等效于
wire out;
assign #10 out = in1 & in2;
// 线网延迟
wire #10 out;
assgin out = in1 & in2;
// 等效于
wire out;
assign #10 out = in1 & in2;
数据流建模使用表达式来描述设计。表达式、操作符和操作数是数据流建模的基础。
表达式:由操作符和操作数构成,目的是根据操作符的意义计算出一个结果。
a ^ b
addr[20:17] + addr[20:17]
in1 | in2
操作数:操作数可以是定义的任何数据类型,
操作符:对操作数进行运算产生一个结果。




带有三个操作数,用法:
condition_expr ? true_expr : false_expr;
即:计算条件表达式,如果为真,则计算true_expr;为假,计算false_expr;为不确定x,则两个表达式都计算,然后两个结果逐位比较。如果相等,则结果中该位的值为操作数中该位的值;如果不想等,则结果中该位的值为x。
条件表达式类似多路选择器

注意:if-else可以替换条件表达式,但是只能在块语句中,不能在连续赋值语句中替换。




