<=
在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/