我正在学习verilog,我读过一些教程,但我对此有点困惑:
何时和为什么使用"assign“关键字,以及何时和为什么使用"<=”运算符。在什么背景下?对我来说,"<=“和"=”之间的区别很明显,是非阻塞的和阻塞的,但除此之外,一些文献从“赋值”开始,还有一些甚至不使用这个关键字。
示例:
赋值var_z =x=x~y
var_z <= a+b
谢谢。
发布于 2016-01-18 09:15:11
assign用于驱动有线/网络类型声明。由于连线根据驱动它们的值更改值,因此每当RHS上的操作数发生变化时,该值将被评估为并分配给LHS(从而模拟一条线路)。
每当右侧值发生变化时,连续赋值都会将值驱动到网中,因此,连续赋值始终是活动的,而当右侧操作数发生变化时,就会发生赋值。
连续赋值在上提供了组合逻辑模型,与门级逻辑相比,提供了更高层次的抽象。
always是一个过程块,用于建模寄存器、和组合逻辑。always块包含敏感列表,即事件列表,必须根据该列表计算块内的逻辑。
always(@ posedge clk)在每个正边处触发块内的逻辑。从而对失败的行为进行建模。
always @ (*)对所有的RHS语句都很敏感。如果在始终块更改的RHS中有任何,则对该特定表达式进行计算和分配。这类似于assign语句,但这种类型的块用于驱动reg数据类型。
// var_z needs to be driven continuously
// Evaluated when any of x or y changes
assign var_z = x|~y 有关更多信息,请参阅赋值语句和连续分配。
进入阻塞和非阻塞语句
阻塞语句必须先执行,然后才能执行在顺序块中跟随它的语句。 Non阻塞语句允许您在不阻塞过程流的情况下对分配进行调度。
通过以下示例更好地理解阻塞和非阻塞分配:
x = #10 5; // x = 5 at time 10ns
y = #5 6; // y = 6 at time 15ns
x <= #10 5; // y = 6 at time 10ns
y <= #5 6; // y = 6 at time 5ns这里,在阻塞赋值中,y是在为x赋值之后计算的。在使用非阻塞分配时,对x和y进行评估,并将它们推送到模拟器内部队列中,并分别在10ns和5ns上分配。
阻塞分配效应immediately.非阻塞分配发生在处理当前“时间增量”的结束时。
因此,直观地说,由于组合块需要连续驱动,所以必须使用阻塞语句。而要建模顺序硬件,保存或保留a值,则必须使用非阻塞赋值。
// model a flop var_z
var_z <= a+b;管道建模是通过非阻塞分配有效完成的.考虑一个shift寄存器示例:
// Improper hardware, q3 is directly assigned the value of d
always @(posedge clk) begin
q1 = d;
q2 = q1;
q3 = q2; end
// Proper hardware, q3=q2, q2=q1 and q1=d
always @(posedge clk) begin
q1 <= d;
q2 <= q1;
q3 <= q2; end以上示例在使用非阻塞分配时建模了适当的硬件。有关更多信息,请参阅NBA论文,此链接。
https://stackoverflow.com/questions/34849832
复制相似问题