文章目录
- 连续赋值语句
- 时延
连续赋值用于数据流行为建模;相反,过程赋值用于顺序行为建模。组合逻辑电路的行为最好使用连续赋值语句建模。
连续赋值语句
连续赋值语句将值赋给线网(连续赋值不能为寄存器赋值),它的格式如下(简单形式):
assign LHS_target = RHS_expression
连续赋值语句在什么时候执行呢? 只要在右端表达式的操作数上有事件(事件为值的变化)发生时,表达式即被计算;如果结果值有变化,新结果就赋给左边的线网。
下面的例子中,目标是一个向量线网和一个标量线网的拼接结果:
wire Cout, Cin;
wire[3:0] Sum, A, B;
...
assign {Cout, Sum} = A + B + Cin;
因为 A 和 B 是 4 位宽,加操作的结果最大能够产生 5 位结果。左端表达式的长度指定为 5 位(Cout
1 位,Sum
4 位)。赋值语句因此促使右端表达式最右边的 4 位的结果赋给 Sum
,第 5 位(进位)赋给 Cout
。
下例采用数据流方式描述 1 位全加器:
module FA_Df(A, B, Cin, Sum, Cout);
input A, B, Cin;
output Sum, Cout;
assign Sum = A ^ B ^ Cin;
assign Cout = (A & Cin) | (B & Cin) | (A & B);
endmodule
时延
如果在连续赋值语句中没有定义时延,如前面的例子,则右端表达式的值立即赋给左端表达式, 时延为 0。如下例所示显式定义连续赋值的时延:
assign #6 Ask = Quiet || Late;
规定右边表达式结果的计算到其赋给左边目标需经过 6 个时间单位时延。
如果右端在传输给左端之前变化,会发生什么呢?在这种情况下,应用最新的变化值。下例显示了这种行为:
assign #4 Cab = Drm;
下图显示了这种变化的效果。右端发生在时延间隔内的变化被滤掉。例如,在时刻 5,Drm
的上升边沿预定在时刻 9 显示在 Cab
上,但是因为 Drm
在时刻 8 下降为 0,预定在 Cab
上的值被删除。