verilog - <= Verilog中的赋值运算符

标签 verilog

<=在Verilog中做什么?

例如:

always @(posedge Clock) begin
   if (Clear) begin
      BCD1 <= 0;
      BCD0 <= 0;
   end
end

最佳答案

在Verilog中,“<=”被称为非阻塞分配,它与“=”具有很大的不同,后者被称为阻塞分配,因为在任何基于供应商的仿真器中调度事件。

建议对顺序逻辑使用非阻塞分配,对组合逻辑使用阻塞分配,只有这样才能在综合过程中推断出正确的硬件逻辑。

顺序块中的非阻塞语句将推断实际硬件中的触发器。

永远记住不要在任何顺序或组合块中混合使用阻塞和非阻塞。

在模拟器的调度过程中:

有四个区域和命令的执行顺序,如下所示

1) Active region
     --Blocking assignments
     --Evaluation of RHS of non-blocking assignments(NBA)
     --Continuous assignment
     --$display command
     --Evaluate input and output of primitives
2) Inactive region
     --#0 blocking assignments
3) NBA(non-blocking assignment update)
     --update LHS of non-blocking assignments (NBA)
4) Postponed
     --$monitor command
     --$strobe command

在同一时隙中对两个变量使用阻塞分配“=”会导致争用情况

例如:带有竞争条件的Verilog代码,
always @(posedge Clock) 
   BCD0 = 0; // Usage of blocking statements should be avoided
always @(posedge Clock) 
   BCD1 = BCD0; 

为了避免竞争状况,请使用非阻塞语句“<=”

例如:
   always @(posedge Clock) 
       BCD0 <= 0; // Recommended to use NBA
    always @(posedge Clock) 
       BCD1 <= BCD0; 

执行此块时,将有两个事件添加到非阻塞分配更新队列中。
因此,它在时间步长结束时从BCD0进行了BCD1的更新。

根据verilog LRM,不允许在连续赋值语句中使用非阻塞式“<=”赋值,这会导致编译错误。

例如:
assign BCD0 <= BCD1; //Results in compilation error

仅在程序分配陈述中使用NBA,
 - initial and
 - always blocks

关于verilog - <= Verilog中的赋值运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26727727/

相关文章:

verilog - 如何实现超过一个时钟周期的时序逻辑?

verilog - 我们可以在 always block 内生成吗?

verilog - verilog中的>>>符号是什么?

python - python 如何在乘法后对 float32 数字进行舍入?

syntax - 此Assign语句中的语法有什么问题?

verilog : Memory block Instantiation

Verilog:是否可以进行索引实例化?

vhdl - 综合全局实例计数

module - 我的测试平台始终将 X 显示为输出

verilog - 4'b1001 , 32' h0 代表什么(VERA SYNTAX)?