You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何我的32×32寄存器阵列输出无法更新?

问题排查与修正方案

核心错误分析

  • 模块实例化名称不匹配:测试平台中实例化的模块是registro4a8,但功能模块名称是register32_32,这导致测试平台未正确调用目标寄存器模块,输出端口始终保持默认的x状态。
  • 选择信号位宽不一致:功能模块中sel定义为6位([5:0]),但测试平台中sel是5位([4:0])。虽然32个寄存器仅需5位选择信号(地址范围0-31),但位宽不匹配可能引发信号截断或扩展问题,影响逻辑正确性。
  • 仿真未主动结束:测试平台未添加$finish命令,仿真会无限循环运行,干扰波形观察。

修正后的代码

功能模块(优化位宽)

module register32_32 
#(parameter BUS_WIDTH = 32)
(
    input [4:0]sel,        // 改为5位,适配32个寄存器的地址范围
    input [BUS_WIDTH - 1:0] d,
    input clk,
    output reg [31:0][BUS_WIDTH - 1:0]q
);

// 可选:初始化寄存器为全0,消除初始x状态
initial begin
    q = '0;
end

always@(posedge clk) begin
    q[sel] <= d; 
end

endmodule

测试平台(修正实例化名称与细节)

`timescale 1ns/1ns
module registrosTB;
reg clk = 0;
reg [31:0]d;
reg [4:0] sel;            // 与模块位宽保持一致
wire [31:0][31:0] q;

// 修正模块实例化名称为register32_32
register32_32 DUT (
    .clk(clk),
    .d(d),
    .sel(sel),
    .q(q)
);

always clk = #5 ~clk;
initial begin
    sel = 1;
    d = 32'hffffffff;
    #10;
    sel = 2;
    d = 32'heeeeeeee;
    #10;
    $finish;              // 添加仿真结束命令
end

endmodule

修正后的效果

修正后,第一个时钟上升沿(#5时刻)会将d=32'hffffffff写入q[1],第二个时钟上升沿(#15时刻)会将d=32'heeeeeeee写入q[2],仿真波形中就能看到预期的赋值结果。

内容的提问来源于stack exchange,提问作者DanyPM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 23:20:00