【问题标题】:trying to load zero bits into register is verilog尝试将零位加载到寄存器中是verilog
【发布时间】:2018-06-07 20:46:02
【问题描述】:

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

【问题讨论】:

  • 我没有看到您尝试将 8 位宽度 0 分配给 outmuxaoutmuxb。你能澄清一下a_selb_sel的条件是什么吗?
  • 例如,如果位置 b[15:8] 中的位全为零,则 outmuxb 不会更改为全零,而是保留 b[7:0] 的位。跨度>

标签: verilog


【解决方案1】:

我在这里看到两个问题:

  1. 您的敏感性声明:

    always @(a_sel or b_sel) begin
    

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

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

  2. 您的case 语句指的是1011。 Verilog 中的数字默认解释为十进制,因此您的 case 被解释为涵盖零、一、十和十一,并对所有其他值使用默认行为(另一个锁存器!)。

    如果您希望您的 case 涵盖 2 位信号的四个可能值 - 我很确定您会这样做! -- 在大小写值前加上'b(例如2'b10)。否则,添加 default: 案例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多