硬體描述語言與驗證

原本打算做成2級位移暫存器,卻如上方般以阻塞賦值(=)撰寫。會發生的問題,下列何者正確?

always @(posedge clk) begin
    q1 = d;
    q2 = q1;
end
  1. Aq2會代入在同一邊緣已更新的q1(也就是d),成為只延遲1級的電路
  2. Bq1與q2的值永遠停留在0
  3. C正確地成為2級位移暫存器,沒有問題
查看答案與解析

正確答案:A. q2會代入在同一邊緣已更新的q1(也就是d),成為只延遲1級的電路

在阻塞賦值中,第1行q1會立即更新為d的值,第2行的q2會代入更新後的q1,也就是d。結果q2與q1成為相同的值,無論是模擬或合成後的電路,都只延遲1級。若寫成「q1 <= d; q2 <= q1;」,q2會代入邊緣之前的q1,就如預期成為2級位移暫存器。將行的順序顛倒也許可以運作,但會成為錯誤的根源。

  • A. 正確。以<=撰寫就會是2級。
  • B. 值會被更新。
  • C. 在阻塞賦值中,下一行會使用到新的值。
練習這個領域 前往領域頁面

硬體描述語言與驗證的其他題目

  1. 在Verilog中區分使用賦值種類時的一般準則,下列何者正確?
  2. 在Verilog中寫「always @(*)」的意義,下列何者正確?
  3. 原本打算做成組合電路,卻如上方般撰寫。可能發生的問題,下列何者正確?
  4. 原本打算做成組合電路,卻如上方般撰寫,邏輯合成會產生什麼?
  5. 上方描述會產生閂鎖器的原因與對策的組合,下列何者正確?

這個領域的比較