尝试将零位加载到寄存器中是verilog

时间:2018-06-07 20:46:03

标签: verilog

我正在使用带有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

1 个答案:

答案 0 :(得分:3)

我在这里看到两个问题:

  1. 您的敏感陈述:

    always @(a_sel or b_sel) begin
    

    不包含a块中引用的信号balways。这将导致您的多路复用器仅在a_selb_sel更改时更新其输出,而不是在输入更改时更新。 (这不太可能在硬件中合成!)

    所有现代版本的Verilog都支持always @(*),它对块中引用的所有信号都很敏感。请改用它。

  2. 您的case语句涉及1011。默认情况下,Verilog中的数字被解释为十进制,因此您的case被解释为覆盖零,一,十和十一,并使用默认行为(另一个锁存!)来表示所有其他值。

    如果您希望case涵盖2位信号的四个可能值 - 我很确定您这样做了! - 使用'b(例如2'b10)为案例值添加前缀。否则,请添加default:案例。