102 lines
4.0 KiB
Verilog
102 lines
4.0 KiB
Verilog
//+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 |