Verilog 中是否有自动矢量宽度强制转换?

Is there automatic vector width coercion in Verilog?

假设我有一个小向量:

wire [15:0] a;

然后我将它分配给一个更大的向量:

reg [31:0] b;

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

结果会怎样? b 会在其高位字中分配零,还是高位部分保持不变?还有别的吗?

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

Verilog 在这种情况下的行为已明确定义。对于您的示例,因为默认值是 unsigned,您将得到以下行为:

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

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

如果 a 签名的 ,即如果 a 是这样声明的:

wire signed [15:0] a;

然后

  • 左侧位为 1'bx1'bz 时的行为与无符号位相同 - 值只是被复制。

  • 当左手位是1'b01'b1时,左手位是符号扩展,即再次值左边的位只是被复制了。此行为取决于b是有符号还是无符号,取决于a是有符号还是无符号。

结果将在高位分配零。也可以合成。

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

请自行检查此代码。