什么是<=用Verilog吗?
例如:
always @(posedge Clock) begin
if (Clear) begin
BCD1 <= 0;
BCD0 <= 0;
end
end
Run Code Online (Sandbox Code Playgroud)
Emm*_*man 17
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
Run Code Online (Sandbox Code Playgroud)
在同一时隙使用阻塞赋值"="表示两个变量会导致竞争条件
例如:具有竞争条件的Verilog代码,
always @(posedge Clock)
BCD0 = 0; // Usage of blocking statements should be avoided
always @(posedge Clock)
BCD1 = BCD0;
Run Code Online (Sandbox Code Playgroud)
为了避免竞争条件,使用非阻塞语句"<="
例如:
always @(posedge Clock)
BCD0 <= 0; // Recommended to use NBA
always @(posedge Clock)
BCD1 <= BCD0;
Run Code Online (Sandbox Code Playgroud)
执行此块时,将向非阻塞分配更新队列添加两个事件.因此,它在时间步骤结束时从BCD0更新BCD1.
根据verilog LRM,不允许在连续赋值语句中使用非阻塞"<="赋值,这将导致编译错误.
例如:
assign BCD0 <= BCD1; //Results in compilation error
Run Code Online (Sandbox Code Playgroud)
仅在程序转让声明中使用NBA,
- initial and
- always blocks
Run Code Online (Sandbox Code Playgroud)