【问题标题】:<= Assignment Operator in Verilog<= Verilog 中的赋值运算符
【发布时间】:2019-12-04 05:55:34
【问题描述】:

&lt;= 在 Verilog 中有什么作用?

例如:

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

【问题讨论】:

标签: verilog


【解决方案1】:

"

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

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

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

模拟器调度过程中:

有四个区域和命令执行顺序如下

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

【讨论】:

    【解决方案2】:

    这称为“非阻塞”分配。非阻塞赋值允许设计者描述状态机更新而不需要声明和使用临时存储变量。

    例如,在此代码中,当您使用非阻塞分配时,它的操作要到下一个时钟周期才会被注册。这意味着分配的顺序无关紧要,并且会产生相同的结果。

    另一个赋值运算符“=”被称为阻塞赋值。当使用 '=' 赋值时,出于逻辑目的,目标变量会立即更新。

    更深入的了解这个,请看这个例子(来自维基百科):

    module toplevel(clock,reset);
        input clock;
        input reset;
    
        reg flop1;
        reg flop2;
    
        always @ (posedge reset or posedge clock)
            if (reset)
            begin
                flop1 <= 0;
                flop2 <= 1;
            end
            else
            begin
                flop1 <= flop2;
                flop2 <= flop1;
            end
    endmodule
    

    在本例中,flop1 &lt;= flop2flop2 &lt;= flop1 将交换这两个 regs 的值。但是如果我们使用阻塞赋值=,就不会发生这种情况,并且行为会出错。

    【讨论】:

      【解决方案3】:

      由于人们已经解释了阻塞/非阻塞情况,我将在此处添加此内容以帮助理解。 阅读代码时,“

      例如:

      .... //这里是Verilog代码

      A

      A什么时候得到B?在给定的时隙中,考虑硬件中发生在时隙中的所有事情,例如由时钟驱动的特定采样事件。如果在具有每 5ns 运行一次的时钟的模块中使用“

      我知道它令人困惑,当你使用和弄乱一堆设计并了解它是如何工作时,它会变得更好。

      【讨论】:

        【解决方案4】:

        "

        考虑下面的代码..

        always@(clk)
        begin
        a=b;
        end
        
        always@(clk)
        begin
        b=a;
        end
        

        a 和 b 的值正在使用两个不同的 always 块进行交换。在此处使用“=”会导致竞争情况。 IE。变量 a 和 b 都在同时变化.. 使用 "

        always@(clk)
        begin
        a<=b;
        end
        
        always@(clk)
        begin
        b<=a;
        end
        

        希望我也有帮助..

        【讨论】:

          【解决方案5】:

          &lt;= 是一个非阻塞赋值。 &lt;= 语句并行执行。想一想流水线架构,我们会在其中遇到使用此类分配的情况。

          一个小例子:

          // 分别用 1、2 和 3 初始化 a、b、c。 initial begin a <= 1 b <= 2 c <= 3 end

          always@(clock.posedge) begin a <= b b <= c c <= a end

          在第一个 posedge 时钟之后: a = 2, b = 3, c = 1

          在第二个摆钟之后: a = 3, b = 1, c = 2

          在第三个摆位时钟之后: a = 1, b = 2, c = 3

          【讨论】:

            【解决方案6】:

            正如大多数人所说,它是一种广泛用于顺序逻辑设计的“非阻塞

            原因如下

            主要涉及延迟(这里是 posedge 时钟),它类似于在提到的延迟之后将 RHS 的评估安排到 LHS 并移动到流程中的下一个语句(模拟顺序),而不像“Blocking =”实际上会根据提到的延迟延迟下一条语句的执行(模拟组合)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-08-02
              • 2019-10-06
              • 2011-11-16
              • 2013-11-30
              • 2015-10-02
              • 1970-01-01
              • 1970-01-01
              • 2014-04-17
              相关资源
              最近更新 更多