<=
在Verilog中做了什么?
例如:
always @(posedge Clock) begin
if (Clear) begin
BCD1 <= 0;
BCD0 <= 0;
end
end
答案 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 <= flop2
和flop2 <= 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;这实际上将延迟执行下一个语句与上述延迟(模拟组合)