//+FHDR-------------------------------------------------------------------------------------------------------- // 增加一个新寄存器: // SECTION A: 添加 localparam ADDR_NEW = 16'hXX;。 // SECTION B: 声明 wire sel_new, we_new, [31:0] reg_new;。 // SECTION C: 增加译码逻辑:assign sel_new = (reg_idx == ADDR_NEW >> 2);。 // SECTION D: 调用底层库,例如 sirv_gnrl_dfflr #(32) new_dff (we_new, wrdata, reg_new, clk, rst_n);。 // SECTION F: 在 always 块中加入 else if (sel_new) rddata_reg = reg_new;。 // SECTION G: 将 reg_new 映射给模块的输出端口。 //-FHDR-------------------------------------------------------------------------------------------------------- module system_regfile # ( parameter CHIPCODE = 32'hDA400801, parameter MFDATE = 32'h20260510 )( // [BLOCK 0] 系统与总线接口 input clk, // 时钟 input rst_n, // 异步复位 (低有效) input [31:0] wrdata, // 总线写数据 input wren, // 写使能 input [24:0] rwaddr, // 地址 (Byte Address) input rden, // 读使能 output [31:0] rddata // 总线读数据 ); // ============================================================================= // [SECTION A] 地址偏移定义 (Localparams) // ============================================================================= localparam TESTR = 16'h00, DATER = 16'h04; // ============================================================================= // [SECTION B] 内部连线声明 (Wires) // ============================================================================= // 寄存器选择信号 (Enable Wires) wire sel_testr, sel_dater; // 写使能信号 (Write Enable Wires) wire we_testr, we_dater; // 寄存器存储连线 (Storage Wires) wire [31:0] testr, dater; // ============================================================================= // [SECTION C] 译码逻辑 (Decoding) // ============================================================================= assign sel_testr = (rwaddr[15:0] == TESTR ); assign sel_dater = (rwaddr[15:0] == DATER ); // 写使能分配 assign we_testr = sel_testr & wren; assign we_dater = sel_dater & wren; // ============================================================================= // [SECTION D] 寄存器实例化 (Storage Implementation) // ============================================================================= // --- 通用与测试寄存器 --- sirv_gnrl_dfflrd #(32) testr_dff (32'h01234567, we_testr, wrdata[31:0], testr, clk, rst_n); sirv_gnrl_dfflrd #(32) sfrtr_dff (32'd20270403, we_dater, wrdata[31:0], dater, clk, rst_n); // ============================================================================= // [SECTION E] 特殊业务逻辑 (Business Logic) // ============================================================================= // LVDS 实时状态寄存器 // sirv_gnrl_dffr #(8) lvdssr_inst ({link_down, train_ready, crc_error_r, phase_adj_req_r, phase_tap[2:0], prefilling}, lvdssr, clk, rst_n); // ============================================================================= // [SECTION F] 读回逻辑 (Readback Mux) // ============================================================================= reg [31:0] rddata_reg; always @(*) begin rddata_reg = 32'b0; if (sel_testr) rddata_reg = testr; else if (sel_dater) rddata_reg = dater; end sirv_gnrl_dfflr #(32) rddata_out_dff (rden, rddata_reg, rddata, clk, rst_n); // ============================================================================= // [SECTION G] 输出映射 (Output Assignments) // ============================================================================= // assign sys_soft_rstn = sys_soft_rstn_r; // assign sync_oen = syncr[18]; // assign nco_clr = ncoctrlr[2]; // assign nco_en = ncoctrlr[1] & doselr[2]; // assign p2a_en = ncoctrlr[0] & doselr[2]; endmodule