2016-09-22 30 views
1

假設我有一個小的矢量:Verilog中是否存在自動矢量寬度強制?

wire [15:0] a; 

,我將其分配到一個較大的載體:

reg [31:0] b; 

always @(posedge clk) begin 
    b <= a; 
end 

會是什麼結果呢? b會在其高位字中分配零,還是高位部分保持不變?還有別的嗎?

我試過尋找其他來源的答案,但是我發現所有的例子在左邊的匹配寬度都是賦值的右邊的操作數。

回答

6

Verilog在這種情況下的行爲已被很好地定義。隨着你的榜樣,因爲默認值是簽名,你會得到這種行爲:

  • 如果a左手位(15位)是1'b01'b1然後a將擴展到32個位寬通過零填充。即b的位31至16將是1'b0

  • 如果a左手位(位15)是1'bx1'bz然後a將通過複製該值被擴展到32個位寬。即b的位31至16將是1'bx,如果位15是1'bz1'bz,如果位15是1'bx

如果a簽署,也就是說,如果a被聲明如下:

wire signed [15:0] a; 

然後

  • 時左手位是1'bx1'bz將是行爲就像它是無符號一樣 - 該值只是複製。

  • 當左手位是1'b01'b1該左手位是符號擴展,即再次證明左手位的值只是複製。此行爲不是取決於b是有符號還是無符號,只有取決於a是有符號還是無符號。

+0

如果任何reg有符號或無符號,它是否會在硬件中產生差異? –

+1

不,我不這麼認爲。 –

1

結果將在高位中指定零。合成也是可能的。

module larger(input [7:0]a, output [15:0] b); 
    assign b = a; 
endmodule 

檢查你的自我這個代碼。