我正在使用带有verilog的modelsim 我目前正在尝试使用8位乘法器构建32位乘法器。 将乘法分成16个阶段,其中在每个阶段中,我将8个位从一个数字乘以另一个数字的8位,因此整体覆盖2个整数32位数。 我在尝试加载“零字节”(8位零点在ine号中的某个位置)时遇到了问题,负责保持这些位的寄存器不会加载零而是保持最后一位8位数不为零。我如何强制此寄存器存储零。 我正在添加我的代码。 非常感谢。
reg [8:0] outmuxa,outmuxb;
always @(a_sel or b_sel) begin
case(a_sel)
00:outmuxa={1'b0,a[7:0]};
01:outmuxa={1'b0,a[15:8]};
10:outmuxa={1'b0,a[23:16]};
11:outmuxa={1'b0,a[31:24]};
endcase
case(b_sel)
00:outmuxb={1'b0,b[7:0]};
01:outmuxb={1'b0,b[15:8]};
10:outmuxb={1'b0,b[23:16]};
11:outmuxb={1'b0,b[31:24]};
endcase
end
答案 0 :(得分:3)
我在这里看到两个问题:
您的敏感陈述:
always @(a_sel or b_sel) begin
不包含a
块中引用的信号b
或always
。这将导致您的多路复用器仅在a_sel
或b_sel
更改时更新其输出,而不是在输入更改时更新。 (这不太可能在硬件中合成!)
所有现代版本的Verilog都支持always @(*)
,它对块中引用的所有信号都很敏感。请改用它。
您的case
语句涉及10
和11
。默认情况下,Verilog中的数字被解释为十进制,因此您的case
被解释为覆盖零,一,十和十一,并使用默认行为(另一个锁存!)来表示所有其他值。
如果您希望case
涵盖2位信号的四个可能值 - 我很确定您这样做了! - 使用'b
(例如2'b10
)为案例值添加前缀。否则,请添加default:
案例。