为何我的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
相关产品推荐
相关产品推荐

