Verilog中{8{A}}赋值16位wire B时高8位为0?原因咨询
Verilog拼接赋值后的高位补零问题解答
问题结论
是的,B的高8位会是0。
原因分析
这个现象由Verilog的位宽匹配时的零扩展特性导致,具体逻辑如下:
{8{A}}是Verilog的重复拼接运算符,它会将1位的输入信号A重复8次,生成一个8位的无符号信号(input A默认是unsigned类型,未声明为signed)。- 当把这个8位信号赋值给16位的
wire [15:0] B时,由于赋值操作左右两侧位宽不匹配(8位 → 16位),Verilog会自动对窄位宽的左侧信号进行零扩展——即在高位填充0,直到位宽与右侧变量一致。
代码验证说明
结合给出的代码示例:
input A; wire [15:0] B; assign B[15:0] = {8{A}}; // => 16'b0000_0000_0000_0000(当A=0时) // => 16'b0000_0000_1111_1111(当A=1时)
- 当
A=0时,{8{A}}生成8'b00000000,零扩展为16位后就是全0; - 当
A=1时,{8{A}}生成8'b11111111,零扩展后高位补8个0,就得到示例中的16位结果。
补充:如果
A被声明为signed类型(比如input signed A;),此时会进行符号扩展而非零扩展——当A=1(二进制补码的-1)时,高位会填充1,最终B会变成16'b1111111111111111。
内容的提问来源于stack exchange,提问作者이준영
相关产品推荐
相关产品推荐

