扫描二维码
随时随地手机看文章
always @(posedge clk) begina = 0;a <= 1;$display(a);end这是一个很tricky 的问题!Verilog调度语义意味着当前仿真时间存在一个4级的仿真队列:1: Active Events (blocking statements)2: Inactive Events (#0 delays, etc)3: Non-Blocking Assign Updates (non-blocking statements)4: Monitor Events ($display, $monitor, etc).由于“a=0”是一个 active event,因此它被安排到第一个“队列”中。“a<=1”中的RHS是一个non-blocking event,因此它被放入第三个队列中。最后,将display 语句放入第4个队列中。只有monitor event队列中的事件完成了才进入到后面的仿真时间。因此,“a=0”会发生,然后显示一个=0。如果我们在下一个仿真时间中查看a的值,它将显示1。 3、以下两行Verilog代码有什么区别?#5 a = b; a = #5 b;#5 a=b;等待5个时间单位后再执行“a=b;”的操作。因此,a的值是时间单位5时b的值。a = #5 b; b的值被计算并存储在内部临时寄存器中,在五个时间单位后,将此存储的值赋值给a。a的值为b在时间单位为0时的值。 4、c = foo ? a : b;和if (foo) c = a;else c = b;的区别是? 当foo = 1'bx, a = 'b1, and b = 'b0时,c = foo ? a : b;会得到“x”if (foo) c = a;else c = b;会得到“0”