Verilog中的=和<=赋值差异
Verilog中为阻塞赋值为非阻塞赋值参考下面完整的程序//比较和两种赋值的区别 //led_e阻塞赋值输出;led_l非阻塞赋值输出 module equ_test( input clk,input rst_n,input sw,output reg hz,output wire led_e, output wire led_l); reg A0; reg B0; reg e,l; reg [25:0] cnt0; //50M分频成0.5Hz always (negedge clk or negedge rst_n) begin if (!rst_n) cnt 0; else if (cnt 49999999) //分频 begin hz ~hz; cnt 0; end else cnt cnt 1; end always (posedge hz) begin Asw; Bsw; end assign led_eB; assign led_lA; endmodule1赋值仅有一条语句Asw;Bsw;led_l和led_e在hz第一个上升沿同时赋值表现为同时点亮2赋值有两条语句always (posedge hz)beginAsw;lA;Bsw;eB;endassign led_ee;assign led_ll;led_e在hz第一个上升沿赋值后点亮led_l在hz第二个上升沿赋值后点亮3赋值有三条语句always (posedge hz)beginAsw;lA;lll;Bsw;eB;eee;endassign led_eee;assign led_lll;led_e在hz第一个上升沿赋值后点亮led_l在hz第二个上升沿赋值后点亮分析阻塞赋值是顺序执行、立即生效。在同一个 hz 上升沿B sw; → B 立刻变成 sw 的当前值e B; → e 立刻变成刚刚更新的 B也就是 swee e; → ee 立刻变成刚刚更新的 e也就是 sw非阻塞赋值是先计算右值等当前时间步结束时才统一更新左值。在同一个 hz 上升沿A sw; → 右值取当前 sw但 A 要等时间步结束才更新l A; → 右值取的是更新前的 A旧值ll l; → 右值取的是更新前的 l旧值所以一个上升沿之后只有 A 变成了 swl 和 ll 还是旧值。sw 要沿着 A → l → ll 一级一级传每级需要一个 hz 上升沿