< = Verilog中的赋值运算符

时间:2014-11-04 04:22:44

标签: verilog

<=在Verilog中做了什么?

例如:

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

6 个答案:

答案 0 :(得分:16)

&#34;&LT; =&#34;在Verilog中称为非阻塞分配,它带来了很多不同于&#34; =&#34;由于在任何基于供应商的模拟器中调度事件,因此称为阻塞分配。

建议对组合逻辑使用顺序逻辑和阻塞分配的非阻塞分配,然后在合成期间推断出正确的硬件逻辑。

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

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

在模拟器的调度过程中:

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

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

使用阻止分配&#34; =&#34;两个变量在同一时间槽引起竞争条件

例如:具有竞争条件的Verilog代码,

always @(posedge Clock) 
   BCD0 = 0; // Usage of blocking statements should be avoided
always @(posedge Clock) 
   BCD1 = BCD0; 

为了避免竞争条件,请使用非阻止语句&#34;&lt; =&#34;

例如:

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

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

使用非阻止&#34;&lt; =&#34;根据verilog LRM,不允许在连续赋值语句中赋值,这将导致编译错误。

例如:

assign BCD0 <= BCD1; //Results in compilation error

仅在程序转让声明中使用NBA,

 - initial and
 - always blocks

答案 1 :(得分:3)

这称为“非阻塞”分配。非阻塞分配允许设计人员描述状态机更新,而无需声明和使用临时存储变量。

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

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

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

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 <= flop2flop2 <= flop1会交换这两个reg的值。但是如果我们使用阻塞分配=,那么这种情况就不会发生,行为就会出错。

答案 2 :(得分:1)

&#34;&LT; =&#34;是verilog中的非阻塞赋值运算符。&#34; =&#34;是一个阻塞赋值运算符。

请考虑以下代码..

always@(clk)
begin
a=b;
end

always@(clk)
begin
b=a;
end

使用两个不同的always块交换a和b的值。使用&#34; =&#34;这引起了一场竞赛。即。变量a和b都在同时变化.. 使用&#34;&lt; =&#34;将避免竞争。

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

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

希望我也帮了..

答案 3 :(得分:1)

由于人们已经解释了阻塞/非阻塞情况,我将在这里添加它以帮助理解。 “&lt; =”在您阅读代码

时替换“获取”一词

例如:

.... //这里的Verilog代码

A&lt; = B //将其读作A得到B

A何时获得B?在给定的时隙中,考虑硬件中发生的所有时隙,例如由时钟驱动的特定采样事件。如果在具有每5ns运行一次的时钟的模块中使用“&lt; =”运算符,想象A在该时隙结束时获得B,在每个其他“阻塞”分配已经解决并且与其他非分配时同时阻止作业。

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

答案 4 :(得分:0)

<=是非阻止分配。 <=语句并行执行。想想一个流水线架构,我们遇到这样的任务。

一个小例子:

//分别用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

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

答案 5 :(得分:-1)

**您的问题被低估了,因为您可以在基本的verilog讲义或书籍中轻松找到它。在这样的论坛上对你或其他人提出的帮助不是很有帮助。

正如大多数人所说,这是一个非阻塞&lt; =&#34;赋值广泛用于顺序逻辑设计,因为它可以最好地模拟它。 这就是为什么:主要涉及延迟(这里是posedge时钟),就像它在上述延迟之后安排RHS对LHS的评估并转移到流程中的下一个语句(模拟顺序)不像&#34;阻止=&#34;这实际上将延迟执行下一个语句与上述延迟(模拟组合)