硬體描述語言與驗證
always @(*) begin
sum = sum + in;
end原本想寫成持續累加輸入in的累加器,卻寫成如上的描述。此描述的問題與修正方法的組合,下列何者正確?
- A沒有問題,會合成出每當in改變時就將in加到sum一次的電路
- B敏感度清單有遺漏,導致模擬與合成的結果不一致。應改寫為@(in)
- C加法器的輸出不經過正反器就回到自己的輸入,值無法確定。應在always @(posedge clk)中寫sum <= sum + in;,每個時脈加一次
查看答案與解析
正確答案:C. 加法器的輸出不經過正反器就回到自己的輸入,值無法確定。應在always @(posedge clk)中寫sum <= sum + in;,每個時脈加一次
always @(*)表示組合電路,因此此描述會成為「以sum為輸入的加法器,其輸出直接接回sum」的電路。由於沒有正反器,加法器的輸出一改變,輸入也跟著改變,值不斷繞行而無法確定,形成組合迴路(Combinational loop)。靜態時序分析也無法處理,許多Lint工具或邏輯合成工具會發出警告或錯誤。累加數值的電路,需要放入在時脈上升緣每次更新一次值的正反器:在always @(posedge clk)中使用非阻塞指定,並以重置決定初始值。
- A. 沒有時脈,就沒有區分「每次一次」的界線,因此不會成為累加器。
- B. @(*)會自動包含所讀取的sum與in,沒有遺漏。即使改為@(in),迴路仍然存在。
- C. 正確。在回授路徑中放入正反器。