Verilog中是否存在自动向量宽度强制?

时间:2016-09-22 06:16:59

标签: verilog

假设我有一个小向量:

reg [31:0] b;

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

我将它分配给更大的矢量:

b

结果会是什么? <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/> 是否会在其较高的单词中分配零,或者高级部分是否保持不变?还有别的吗?

我已经尝试在其他来源中搜索答案,但我发现的所有示例都在左侧匹配宽度和赋值的右侧操作数。

2 个答案:

答案 0 :(得分:6)

在这种情况下,Verilog的行为已经明确定义。在您的示例中,因为默认值为 unsigned ,您将获得此行为:

  • 如果a的左手位(位15)为1'b01'b1,那么a将通过零填充扩展到32位宽。即b的第31至16位将为1'b0

  • 如果a的左手位(位15)为1'bx1'bz,则a将通过复制该值扩展为32位宽。即如果第15位为b,则1'bx的第31位至第16位将为1'bz,如果第15位为1'bz,则为1'bx

如果a 签名,即如果a声明如下:

wire signed [15:0] a;

然后

  • 左手位为1'bx1'bz时的行为与未签名时的行为相同 - 只是复制了该值。

  • 当左手位为1'b01'b1左手位为符号扩展时,即左手位的值仅为复制。此行为取决于b是已签名还是未签名,a是已签名还是未签名。

答案 1 :(得分:1)

结果将在高位中分配零。合成也是可能的。

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

为此代码检查自己。