掃描二維碼
隨時隨地手機看文章
always @(posedge clk) begina = 0;a <= 1;$display(a);end這是一個很tricky 的問題!Verilog調(diào)度語義意味著當前仿真時間存在一個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,因此它被安排到第一個“隊列”中?!?/span>a<=1”中的RHS是一個non-blocking event,因此它被放入第三個隊列中。最后,將display 語句放入第4個隊列中。只有monitor event隊列中的事件完成了才進入到后面的仿真時間。因此,“a=0”會發(fā)生,然后顯示一個=0。如果我們在下一個仿真時間中查看a的值,它將顯示1。?3、以下兩行Verilog代碼有什么區(qū)別?#5 a = b; a = #5 b;#5 a=b;等待5個時間單位后再執(zhí)行“a=b;”的操作。因此,a的值是時間單位5時b的值。a = #5 b; b的值被計算并存儲在內(nèi)部臨時寄存器中,在五個時間單位后,將此存儲的值賦值給a。a的值為b在時間單位為0時的值。?4、c = foo ? a : b;和if (foo) c = a;else c = b;的區(qū)別是??當foo = 1'bx, a = 'b1, and b = 'b0時,c = foo ? a : b;會得到“x”if (foo) c = a;else c = b;會得到“0”