Verilog中4位变量首位反转问题:输入与输出值不符求解
Verilog 4位变量输出异常的原因
你遇到的不是“首位反转”,核心问题是没有给赋值的数字指定二进制基数,导致Verilog对数字的解析逻辑和你的预期完全不符。
问题根源:Verilog的数字解析规则
Verilog中直接写数字(比如0111)时,默认解析规则是:
- 数字以
0开头时,标准Verilog会将其视为八进制数; - 部分旧模拟器或兼容模式下,会把开头带
0的数字仍按十进制解析; - 只有加上
'b(或指定位宽如4'b)前缀,才会被解析为二进制数,这才是你实际想要的赋值方式。
对应你的代码和输出分析
- 前两行赋值
0000、0001:
不管是八进制还是十进制,数值都是0和1,对应二进制0000、0001,所以输出符合预期。 - 第三行赋值
0111:
你的模拟器将其解析为十进制111,二进制为1101111,由于A、B是4位变量,会自动截断取低4位1111,所以输出全1。 - 第四行赋值
A=0011; B=1011;:0011被解析为十进制11,二进制是1011,赋值给A后输出1011;1011是十进制1011,二进制为1111110011,截断取低4位是0011,赋值给B后输出0011;
这就造成了“输出反转”的假象。
解决方法
所有二进制赋值必须明确加上二进制基数标识,修改后的代码如下:
module test; reg [3:0] A; reg [3:0] B; initial begin $monitor("%b %b",A,B); $display("A B"); A=4'b0000; B=4'b0000; #1 A=4'b0001; B=4'b0001; #1 A=4'b0111; B=4'b0111; #1 A=4'b0011; B=4'b1011; end endmodule
修改后输出会完全符合预期:
A B
0000 0000
0001 0001
0111 0111
0011 1011
内容的提问来源于stack exchange,提问作者user17197333
相关产品推荐
相关产品推荐

