0% found this document useful (0 votes)
26 views24 pages

CSR

The document describes a PMBus CSR (Control and Status Register) module implemented in a hardware description language. It includes parameters for address and data width, AXI interface signals for read and write transactions, and logic for handling command look-up tables. Additionally, it defines address validation functions and response handling for both read and write operations.

Uploaded by

praveenb123pavi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
26 views24 pages

CSR

The document describes a PMBus CSR (Control and Status Register) module implemented in a hardware description language. It includes parameters for address and data width, AXI interface signals for read and write transactions, and logic for handling command look-up tables. Additionally, it defines address validation functions and response handling for both read and write operations.

Uploaded by

praveenb123pavi
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 24

import pmbus_csr_pkg :: *;

module pmbus_csr
#(
parameter AW = 32,
parameter DW = 32
)
(
// Clock and Reset
input logic clk,
input logic rst_n,

//AXI Interface
input logic awvalid,
input logic [AW-1:0] awaddr,
input logic [3:0] awlen,
input logic [2:0] awsize,
output logic awready,

//
input logic wvalid,
input logic [DW-1:0] wdata,
output logic wready,

output logic bvalid,


input logic bready,
output logic [1:0] bresp,

input logic arvalid,


input logic [AW-1:0] araddr,
input logic [3:0] arlen,
input logic [2:0] arsize,
output logic arready,

output logic [1:0] rresp, // read responce


output logic rvalid,
output logic [DW-1:0] rdata,
input logic rready,

input reg_ro_port_list in_port_list,


output reg_rw_port_list out_port_list,

// CSR CMD LUT Interface


output logic cmd_lut_0_wr_en_o,
output logic [AW-1:0] cmd_lut_0_wr_addr_o,
output logic cmd_lut_1_wr_en_o,
output logic [AW-1:0] cmd_lut_1_wr_addr_o,

output logic cmd_lut_0_rd_en_o,


output logic [AW-1:0] cmd_lut_0_rd_addr_o,
output logic cmd_lut_1_rd_en_o,
output logic [AW-1:0] cmd_lut_1_rd_addr_o,

output logic [DW-1:0] cmd_lut_x_data_o,


input logic [DW-1:0] cmd_lut_0_rd_data_i,
input logic [DW-1:0] cmd_lut_1_rd_data_i,

// FSM CMD LUT Interface


input logic [AW-1:0] hw_cmd_lut_rd_addr_i,
input logic hw_cmd_lut_rd_req_i,
output logic [DW-1:0] hw_cmd_lut_rd_data_o,
output logic hw_cmd_lut_rd_ack_o,

output logic fast_int,


output logic norm_int
);

//Register Address parameters


localparam C0_PMBUS_CTRL0_ADDRESS = 16'd0000;
localparam C0_PMBUS_CTRL1_ADDRESS = 16'd0004;
localparam C0_PMBUS_CTRL2_ADDRESS = 16'd0008;
localparam C0_PMBUS_CTRL3_ADDRESS = 16'd0012;
localparam C0_PMBUS_ADDR_CTRL0_ADDRESS = 16'd0024;
localparam C0_PMBUS_ADDR_CTRL1_ADDRESS = 16'd0028;
localparam C0_PMBUS_ADDR_CTRL2_ADDRESS = 16'd0032;
localparam C0_PMBUS_ADDR_CTRL3_ADDRESS = 16'd0036;
localparam C0_PMBUS_STS0_ADDRESS = 16'd0040;
localparam C0_PMBUS_ERR_STS0_ADDRESS = 16'd0044;
localparam C0_PMBUS_STS1_ADDRESS = 16'd0048;
localparam C0_PMBUS_ERR_STS1_ADDRESS = 16'd0052;
localparam C0_PMBUS_RX_DBUF_ADDRESS = 16'd0064;
localparam C0_PMBUS_TX_BUF_ADDRESS = 16'd0084;
localparam C0_PMBUS_ACK_CTRL_ADDRESS = 16'd0096;
localparam C0_PMBUS_INT_MASK_CTRL_ADDRESS = 16'd0100;
localparam C0_PMBUS_CLK_LOW_TO_ADDRESS = 16'd0104;
localparam C0_RAIL_ENABLE_ADDRESS = 16'd0112;
localparam C0_PHASE_ENABLE_ADDRESS = 16'd0116;
localparam C0_PARTITION_ENABLE_ADDRESS = 16'd0120;

//wire/reg/logic declartion

//write signals
logic write_b;
logic reg_write;
logic [AW-1:0] reg_write_address;

//read signals
logic reg_read_csr;
logic reg_read_csr_d;
logic rvalid_csr;
//logic rvalid_d;
logic [AW-1:0] reg_read_address;

logic rvalid_csr_d;
logic rvalid_cmdlut_d;
logic rvalid_tmp;
//logic rvalid_o;

//cmd lut
logic hw_cmd_lut_0_rd_en;
logic hw_cmd_lut_1_rd_en;
logic hw_cmd_lut_0_rd_en_d;
logic hw_cmd_lut_1_rd_en_d;
logic hw_cmd_lut_x_rd_en;
logic cmd_lut_0_rd_en_o_d;
logic cmd_lut_1_rd_en_o_d;

///////////////////////////////////////////////////////////////////////////////////
////////////
/// write transfer enable
reg write_en;
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)begin
write_en <= 0;
end
else if(awready)begin
write_en <=1'b1;
end else if(bvalid && bready)
write_en <=1'b0;
end
// Write Address Channel Handshake
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
awready <= 0;
end
else begin
// if(awvalid && !awready)
awready <= awvalid && !awready && !write_en;//1'b1;
end
end

// Write Data Channel Handshake


always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
wready <= 0;
end
else begin
wready <= wvalid && !wready;
end
end

/// read transfer enable


reg read_en;
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)begin
read_en <= 0;
end
else if(arready)begin
read_en <=1'b1;
end else if(rvalid)
read_en <=1'b0;
end
///read addr handshake
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)begin
arready <= 0;
end
else begin
arready <=arvalid && !arready && !read_en;
end
end
//----temp logic for axi read valid---
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rvalid_csr <= 0;
end
else if (arready && !hw_cmd_lut_x_rd_en) begin
rvalid_csr <= 1;
end
else begin
rvalid_csr <= 0;
end
end

//--when axi wants to read RX FIFO, rvalid needs to be delayed due to data path
delay
/*always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rvalid_d <= 0;
end
else begin
rvalid_d <= rvalid_csr && (reg_read_address == C0_PMBUS_RX_DBUF_ADDRESS);
end
end*/

//--- Align all valid signals with rdata by delaying them one cycle ---
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rvalid_csr_d <= 0;
rvalid_cmdlut_d <= 0;
end
else begin
rvalid_csr_d <= rvalid_csr;
rvalid_cmdlut_d <= rvalid_csr_d;
end
end
assign cmdlut_en = ((reg_read_address[11:0] >= 12'h800) && (reg_read_address[11:0]
<= 12'hFFC) || (reg_read_address[11:0] == 12'h40));

//--- Combine delayed CSR & cmdlut valid


assign rvalid_tmp = cmdlut_en ? rvalid_csr_d : rvalid_csr;

//assign rvalid = rvalid_csr_d;

//--- Final aligned rvalid signal (one cycle delayed to match rdata)
// assign rvalid_o = (reg_read_address == C0_PMBUS_RX_DBUF_ADDRESS) ? rvalid_d :
rvalid_tmp;

//lc assign rvalid_o = (reg_read_address == C0_PMBUS_RX_DBUF_ADDRESS) ?


rvalid_csr_d : rvalid_tmp;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n) begin
rvalid <= 0;
end
else if (rvalid && !rready) begin
rvalid <= rvalid;
end
else begin
//rvalid <= rvalid_o;
rvalid <= rvalid_tmp;
end
end

//pulse creation for write transaction when wvalid comes


always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
write_b<=0;
end
else if (wvalid) begin
write_b <= 1;
end
else begin
write_b <=0;
end
end

assign reg_write = wvalid && write_b;


//assign reg_write = write_b;
//axi write address stored in temp register
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
reg_write_address <= 32'd0;
end
else if(awvalid) begin
reg_write_address <= awaddr;
end
end

//axi read address stored in temp register


always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
reg_read_address <= 32'd0;
end
else if(arvalid) begin
reg_read_address <=araddr;
end
end

// Read transaction state tracking


always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
reg_read_csr <= 1'b0;
end
// else if (arvalid && arready) begin
else if(arready)begin
reg_read_csr <= 1'b1;
end
else if (rvalid && rready) begin
reg_read_csr <= 1'b0;
end
end

// Read transaction delayed version for rx data buffer


always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
reg_read_csr_d <= 1'b0;
end
else begin
reg_read_csr_d <= reg_read_csr;
end
end

assign reg_read = (reg_read_address == C0_PMBUS_RX_DBUF_ADDRESS) ?


reg_read_csr_d : reg_read_csr;

////////////////////////// error condition for address mismatch

function logic is_valid_csr_addr(input logic [15:0] addr);


if (addr[1:0] != 2'b00)
return 1'b0;

// predefined CSR addresses


case (addr)
16'd0000, 16'd0004, 16'd0008, 16'd00012,
16'd0024, 16'd0028, 16'd0032, 16'd0036,
16'd0040, 16'd0044, 16'd0048, 16'd0052,
16'd0064, 16'd0084, 16'd0096, 16'd0100,
16'd0104, 16'd0112, 16'd0116, 16'd0120:
return 1'b1;
default: begin
// Allow address range 0x0800 to 0x0BFC
if (addr >= 16'h0800 && addr <= 16'h0BFC && addr[1:0] == 2'b00)
return 1'b1;
// Allow address range 0x0C00 to 0x0FFC
else if (addr >= 16'h0C00 && addr <= 16'h0FFC && addr[1:0] == 2'b00)
return 1'b1;
else //if(!bready)
return 1'b0;
end
endcase
endfunction
//
logic addr_valid;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n) begin
addr_valid <= 32'b0;
end else
addr_valid <= is_valid_csr_addr(reg_write_address[15:0]);
end

////////////////write responce
logic [1:0] bresp_reg;
logic bvalid_reg;
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
bresp_reg <= 2'b00;
bvalid_reg <= 1'b0;
end else begin
if (reg_write) begin
if (!is_valid_csr_addr(reg_write_address[15:0])) begin
bresp_reg <= 2'b11; // DECERR
end else begin
bresp_reg <= 2'b00; // OKAY
end
bvalid_reg <= 1'b1;
end else if (bvalid_reg && bready) begin
// Response accepted by master
bvalid_reg <= 1'b0;
bresp_reg <= 2'b0;
end
end
end

assign bresp = bresp_reg;


assign bvalid = bvalid_reg;
//////////////////read responce

logic [1:0]rresp_reg;
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
rresp_reg <= 2'b00;
end
if (reg_read) begin
if (!is_valid_csr_addr(reg_read_address[15:0])) begin
rresp_reg <= 2'b11; // DECERR
end else begin
rresp_reg <= 2'b00; // OKAY
end
end else
rresp_reg <= 2'b0;
end
assign rresp = rvalid ? rresp_reg : 2'b0;

// CMD LUT Read Interface//


always_comb begin
// Default values
cmd_lut_0_rd_en_o = 1'b0;
cmd_lut_0_rd_addr_o = 32'd0;
cmd_lut_1_rd_en_o = 1'b0;
cmd_lut_1_rd_addr_o = 32'd0;

hw_cmd_lut_0_rd_en = 1'b0;
hw_cmd_lut_1_rd_en = 1'b0;

// Read by FW (via AXI) TODO: add semaphore later


if (reg_read) begin
//------normal command lut---------
if ((reg_read_address[11:0] >= 12'h800) && (reg_read_address[11:0] <=
12'hBFC)) begin
cmd_lut_0_rd_en_o = 1'b1;
cmd_lut_0_rd_addr_o = reg_read_address;
end
//---extended command lut -----
else if ((reg_read_address[11:0] >= 12'hC00) && (reg_read_address[11:0] <=
12'hFFC)) begin
cmd_lut_1_rd_en_o = 1'b1;
cmd_lut_1_rd_addr_o = reg_read_address;
end
end
// Read by HW (from PMBus FSM)
else if (hw_cmd_lut_rd_req_i) begin
//------normal command lut---------
if ((hw_cmd_lut_rd_addr_i[11:0] >= 12'h800) && (hw_cmd_lut_rd_addr_i[11:0] <=
12'hBFC)) begin
cmd_lut_0_rd_en_o = 1'b1;
cmd_lut_0_rd_addr_o = hw_cmd_lut_rd_addr_i;
hw_cmd_lut_0_rd_en = 1'b1;
end
//---extended command lut -----
else if ((hw_cmd_lut_rd_addr_i[11:0] >= 12'hC00) &&
(hw_cmd_lut_rd_addr_i[11:0] <= 12'hFFC)) begin
cmd_lut_1_rd_en_o = 1'b1;
cmd_lut_1_rd_addr_o = hw_cmd_lut_rd_addr_i;
hw_cmd_lut_1_rd_en = 1'b1;
end
end
end

// CMD LUT Write Interface


always_comb begin
cmd_lut_0_wr_en_o = 1'b0;
cmd_lut_1_wr_en_o = 1'b0;
cmd_lut_0_wr_addr_o = 32'b0;
cmd_lut_1_wr_addr_o = 32'b0;

if (reg_write) begin
if ((reg_write_address[11:0] >= 12'h800) && (reg_write_address[11:0] <=
12'hBFC)) begin
cmd_lut_0_wr_en_o = 1'b1;
cmd_lut_0_wr_addr_o = reg_write_address;
cmd_lut_x_data_o = wdata;//wvalid ? wdata : 32'b0;
end
else if ((reg_write_address[11:0] >= 12'hC00) && (reg_write_address[11:0] <=
12'hFFC)) begin
cmd_lut_1_wr_en_o = 1'b1;
cmd_lut_1_wr_addr_o = reg_write_address;
cmd_lut_x_data_o = wdata;//wvalid ? wdata : 32'b0;
end
end
end

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n) begin
hw_cmd_lut_0_rd_en_d <= 1'b0;
hw_cmd_lut_1_rd_en_d <= 1'b0;
end
else begin
hw_cmd_lut_0_rd_en_d <= hw_cmd_lut_0_rd_en;
hw_cmd_lut_1_rd_en_d <= hw_cmd_lut_1_rd_en;
end
end

assign hw_cmd_lut_rd_data_o = (hw_cmd_lut_0_rd_en_d) ? cmd_lut_0_rd_data_i :


(hw_cmd_lut_1_rd_en_d) ? cmd_lut_1_rd_data_i : 32'd0;
assign hw_cmd_lut_rd_ack_o = (hw_cmd_lut_0_rd_en_d | hw_cmd_lut_1_rd_en_d);
assign hw_cmd_lut_x_rd_en = (hw_cmd_lut_0_rd_en | hw_cmd_lut_1_rd_en);

///////////////////////////////////////////////////////////////////////////////////
//////////
//\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
\\\\\\\\\
//WRITE LOGIC
//write logic for register c0_pmbus_ctrl0
logic [31:0] c0_pmbus_ctrl0;
logic [3:0] c0_pmbus_ctrl0_alert_en_vld;
localparam C0_PMBUS_CTRL0_RESERVED_MASK = 32'h3730_0ff7;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n) begin
c0_pmbus_ctrl0 <= { 2'h0, 2'h0, 1'h0, 3'h0, 2'h0, 1'h0, 1'h0, 8'h0, 1'h0,
1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0 };
c0_pmbus_ctrl0_alert_en_vld <= 4'b0;
end
else if ((reg_write_address == C0_PMBUS_CTRL0_ADDRESS) && reg_write) begin
c0_pmbus_ctrl0_alert_en_vld <= {wdata[7:4]};

case(awsize)
3'b000: c0_pmbus_ctrl0 <= {c0_pmbus_ctrl0[31:8], wdata[7:0]} &
C0_PMBUS_CTRL0_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_ctrl0 <= {c0_pmbus_ctrl0[31:16], wdata[15:0]} &
C0_PMBUS_CTRL0_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_ctrl0 <= {wdata[31:0]} &
C0_PMBUS_CTRL0_RESERVED_MASK;// 4 byte
endcase
end
else begin
c0_pmbus_ctrl0[4] <= ~in_port_list.c0_pmbus_ctrl0_clr_alert_en[0] &
c0_pmbus_ctrl0[4];
c0_pmbus_ctrl0[5] <= ~in_port_list.c0_pmbus_ctrl0_clr_alert_en[1] &
c0_pmbus_ctrl0[5];
c0_pmbus_ctrl0[6] <= ~in_port_list.c0_pmbus_ctrl0_clr_alert_en[2] &
c0_pmbus_ctrl0[6];
c0_pmbus_ctrl0[7] <= ~in_port_list.c0_pmbus_ctrl0_clr_alert_en[3] &
c0_pmbus_ctrl0[7];
c0_pmbus_ctrl0_alert_en_vld <= 4'b0;
end
end

assign out_port_list.c0_pmbus_ctrl0_pmbus_ctrl_en = c0_pmbus_ctrl0[0];


assign out_port_list.c0_pmbus_ctrl0_sgl_multi_dev_addr = c0_pmbus_ctrl0[1];
assign out_port_list.c0_pmbus_ctrl0_pec_en = c0_pmbus_ctrl0[2];
assign out_port_list.c0_pmbus_ctrl0_alert_en0 = c0_pmbus_ctrl0[4];
assign out_port_list.c0_pmbus_ctrl0_alert_en1 = c0_pmbus_ctrl0[5];
assign out_port_list.c0_pmbus_ctrl0_alert_en2 = c0_pmbus_ctrl0[6];
assign out_port_list.c0_pmbus_ctrl0_alert_en3 = c0_pmbus_ctrl0[7];
assign out_port_list.c0_pmbus_ctrl0_alert_auto = c0_pmbus_ctrl0[8];
assign out_port_list.c0_pmbus_ctrl0_alert_en_vld =
c0_pmbus_ctrl0_alert_en_vld;
assign out_port_list.c0_pmbus_ctrl0_zone_en = c0_pmbus_ctrl0[9];
assign out_port_list.c0_pmbus_ctrl0_zone_wr_act = c0_pmbus_ctrl0[10];
assign out_port_list.c0_pmbus_ctrl0_zone_rd_act = c0_pmbus_ctrl0[11];
assign out_port_list.c0_pmbus_ctrl0_zdht_en = c0_pmbus_ctrl0[20];
assign out_port_list.c0_pmbus_ctrl0_nack_for_bsy = c0_pmbus_ctrl0[21];
assign out_port_list.c0_pmbus_ctrl0_page_no =
c0_pmbus_ctrl0[26:24];
assign out_port_list.c0_pmbus_ctrl0_page_no_def =
c0_pmbus_ctrl0[29:28];
//write logic for register c0_pmbus_ctrl1
logic [31:0] c0_pmbus_ctrl1;
localparam C0_PMBUS_CTRL1_RESERVED_MASK = 32'hff7d_f7df;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_ctrl1 <= { 8'h0, 1'h0, 5'h0, 1'h0, 5'h0, 1'h0, 5'h0, 1'h0,
5'h0 };
else if ((reg_write_address == C0_PMBUS_CTRL1_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_ctrl1 <= {c0_pmbus_ctrl1[31:8], wdata[7:0]} &
C0_PMBUS_CTRL1_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_ctrl1 <= {c0_pmbus_ctrl1[31:16], wdata[15:0]} &
C0_PMBUS_CTRL1_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_ctrl1 <= {wdata[31:0]} &
C0_PMBUS_CTRL1_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_ctrl1_phase_no_pg0 = c0_pmbus_ctrl1[4:0];


assign out_port_list.c0_pmbus_ctrl1_phase_no_pg1 = c0_pmbus_ctrl1[10:6];
assign out_port_list.c0_pmbus_ctrl1_phase_no_pg2 =
c0_pmbus_ctrl1[16:12];
assign out_port_list.c0_pmbus_ctrl1_phase_no_pg3 =
c0_pmbus_ctrl1[22:18];
assign out_port_list.c0_pmbus_ctrl1_sw_reset_vec =
c0_pmbus_ctrl1[31:24];

//write logic for register c0_pmbus_ctrl2


logic [31:0] c0_pmbus_ctrl2;
localparam C0_PMBUS_CTRL2_RESERVED_MASK = 32'hffff_ffff;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_ctrl2 <= { 8'h0, 8'h0, 8'h0, 8'h0 };
else if ((reg_write_address == C0_PMBUS_CTRL2_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_ctrl2 <= {c0_pmbus_ctrl2[31:8], wdata[7:0]} &
C0_PMBUS_CTRL2_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_ctrl2 <= {c0_pmbus_ctrl2[31:16], wdata[15:0]} &
C0_PMBUS_CTRL2_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_ctrl2 <= {wdata[31:0]} &
C0_PMBUS_CTRL2_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_ctrl2_page_base_addr_pg0 = c0_pmbus_ctrl2[7:0];


assign out_port_list.c0_pmbus_ctrl2_page_base_addr_pg1 = c0_pmbus_ctrl2[15:8];
assign out_port_list.c0_pmbus_ctrl2_page_base_addr_pg2 =
c0_pmbus_ctrl2[23:16];
assign out_port_list.c0_pmbus_ctrl2_page_base_addr_pg3 =
c0_pmbus_ctrl2[31:24];

//write logic for register c0_pmbus_ctrl3


logic [31:0] c0_pmbus_ctrl3;
localparam C0_PMBUS_CTRL3_RESERVED_MASK = 32'h7d01_bf77;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_ctrl3 <= { 1'h0, 2'h0, 1'h0, 1'h1, 1'h1, 1'h0, 1'h0, 7'h0, 1'h0,
1'h0, 1'h0, 6'h19, 1'h0, 3'h4, 1'h0, 3'h2 };
else if ((reg_write_address == C0_PMBUS_CTRL3_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_ctrl3 <= {c0_pmbus_ctrl3[31:8], wdata[7:0]} &
C0_PMBUS_CTRL3_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_ctrl3 <= {c0_pmbus_ctrl3[31:16], wdata[15:0]} &
C0_PMBUS_CTRL3_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_ctrl3 <= {wdata[31:0]} &
C0_PMBUS_CTRL3_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_ctrl3_tx_low_threhold = c0_pmbus_ctrl3[2:0];


assign out_port_list.c0_pmbus_ctrl3_glitch_fltr_len = c0_pmbus_ctrl3[6:4];
assign out_port_list.c0_pmbus_ctrl3_tsu_dat = c0_pmbus_ctrl3[13:8];
assign out_port_list.c0_pmbus_ctrl3_clock_low_en = c0_pmbus_ctrl3[15];
assign out_port_list.c0_pmbus_ctrl3_clock_high_en = c0_pmbus_ctrl3[16];
assign out_port_list.c0_pmbus_ctrl3_rx_buf_size_dbg = c0_pmbus_ctrl3[24];
assign out_port_list.c0_pmbus_ctrl3_scl_low_en_dbg = c0_pmbus_ctrl3[26];
assign out_port_list.c0_pmbus_ctrl3_tx_db_ur_cs_dbg = c0_pmbus_ctrl3[27];
assign out_port_list.c0_pmbus_ctrl3_slv_ip_busy = c0_pmbus_ctrl3[28];
assign out_port_list.c0_pmbus_ctrl3_data_rate =
c0_pmbus_ctrl3[30:29];

//write logic for register c0_pmbus_addr_ctrl0


logic [31:0] c0_pmbus_addr_ctrl0;
localparam C0_PMBUS_ADDR_CTRL0_RESERVED_MASK = 32'h0000_7f7f;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_addr_ctrl0 <= { 17'h0, 7'h0, 1'h0, 7'h0 };
else if ((reg_write_address == C0_PMBUS_ADDR_CTRL0_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_addr_ctrl0 <= {c0_pmbus_addr_ctrl0[31:8], wdata[7:0]}
& C0_PMBUS_ADDR_CTRL0_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_addr_ctrl0 <= {c0_pmbus_addr_ctrl0[31:16], wdata[15:0]}
& C0_PMBUS_ADDR_CTRL0_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_addr_ctrl0 <= {wdata[31:0]}
& C0_PMBUS_ADDR_CTRL0_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_addr_ctrl0_pmbus_slave_address=
c0_pmbus_addr_ctrl0[6:0];
assign out_port_list.c0_pmbus_addr_ctrl0_pmbus_slave_addr_mask=
c0_pmbus_addr_ctrl0[14:8];

//write logic for register c0_pmbus_addr_ctrl1


logic [31:0] c0_pmbus_addr_ctrl1;
localparam C0_PMBUS_ADDR_CTRL1_RESERVED_MASK = 32'h007f_7f7f;
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)
c0_pmbus_addr_ctrl1 <= { 9'h0, 7'h0C, 1'h0, 7'h28, 1'h0, 7'h37 };
else if ((reg_write_address == C0_PMBUS_ADDR_CTRL1_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_addr_ctrl1 <= {c0_pmbus_addr_ctrl1[31:8], wdata[7:0]}
& C0_PMBUS_ADDR_CTRL1_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_addr_ctrl1 <= {c0_pmbus_addr_ctrl1[31:16], wdata[15:0]}
& C0_PMBUS_ADDR_CTRL1_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_addr_ctrl1 <= {wdata[31:0]}
& C0_PMBUS_ADDR_CTRL1_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_addr_ctrl1_zw_addr =
c0_pmbus_addr_ctrl1[6:0];
assign out_port_list.c0_pmbus_addr_ctrl1_zr_addr =
c0_pmbus_addr_ctrl1[14:8];
assign out_port_list.c0_pmbus_addr_ctrl1_ara_addr =
c0_pmbus_addr_ctrl1[22:16];

//write logic for register c0_pmbus_addr_ctrl2


logic [31:0] c0_pmbus_addr_ctrl2;
localparam C0_PMBUS_ADDR_CTRL2_RESERVED_MASK = 32'hffff_ffff;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_addr_ctrl2 <= { 1'h0, 7'h0, 1'h0, 7'h0, 1'h0, 7'h0, 1'h0, 7'h0 };
else if ((reg_write_address == C0_PMBUS_ADDR_CTRL2_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_addr_ctrl2 <= {c0_pmbus_addr_ctrl2[31:8], wdata[7:0]}
& C0_PMBUS_ADDR_CTRL2_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_addr_ctrl2 <= {c0_pmbus_addr_ctrl2[31:16], wdata[15:0]}
& C0_PMBUS_ADDR_CTRL2_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_addr_ctrl2 <= {wdata[31:0]}
& C0_PMBUS_ADDR_CTRL2_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_addr_ctrl2_pg0_slv_addr =
c0_pmbus_addr_ctrl2[6:0];
assign out_port_list.c0_pmbus_addr_ctrl2_pg0_addr_en =
c0_pmbus_addr_ctrl2[7];
assign out_port_list.c0_pmbus_addr_ctrl2_pg1_slv_addr =
c0_pmbus_addr_ctrl2[14:8];
assign out_port_list.c0_pmbus_addr_ctrl2_pg1_addr_en =
c0_pmbus_addr_ctrl2[15];
assign out_port_list.c0_pmbus_addr_ctrl2_pg2_slv_addr =
c0_pmbus_addr_ctrl2[22:16];
assign out_port_list.c0_pmbus_addr_ctrl2_pg2_addr_en =
c0_pmbus_addr_ctrl2[23];
assign out_port_list.c0_pmbus_addr_ctrl2_pg3_slv_addr =
c0_pmbus_addr_ctrl2[30:24];
assign out_port_list.c0_pmbus_addr_ctrl2_pg3_addr_en =
c0_pmbus_addr_ctrl2[31];

//write logic for register c0_pmbus_addr_ctrl3


logic [31:0] c0_pmbus_addr_ctrl3;
localparam C0_PMBUS_ADDR_CTRL3_RESERVED_MASK = 32'hffff_ffff;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_addr_ctrl3 <= { 1'h0, 7'h0, 1'h0, 7'h0, 1'h0, 7'h0, 1'h0, 7'h0 };
else if ((reg_write_address == C0_PMBUS_ADDR_CTRL3_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_addr_ctrl3 <= {c0_pmbus_addr_ctrl3[31:8], wdata[7:0]}
& C0_PMBUS_ADDR_CTRL3_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_addr_ctrl3 <= {c0_pmbus_addr_ctrl3[31:16], wdata[15:0]}
& C0_PMBUS_ADDR_CTRL3_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_addr_ctrl3 <= {wdata[31:0]}
& C0_PMBUS_ADDR_CTRL3_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_addr_ctrl3_rsv0_slv_addr =
c0_pmbus_addr_ctrl3[6:0];
assign out_port_list.c0_pmbus_addr_ctrl3_rsv0_addr_en =
c0_pmbus_addr_ctrl3[7];
assign out_port_list.c0_pmbus_addr_ctrl3_rsv1_slv_addr =
c0_pmbus_addr_ctrl3[14:8];
assign out_port_list.c0_pmbus_addr_ctrl3_rsv1_addr_en =
c0_pmbus_addr_ctrl3[15];
assign out_port_list.c0_pmbus_addr_ctrl3_rsv2_slv_addr =
c0_pmbus_addr_ctrl3[22:16];
assign out_port_list.c0_pmbus_addr_ctrl3_rsv2_addr_en =
c0_pmbus_addr_ctrl3[23];
assign out_port_list.c0_pmbus_addr_ctrl3_rsv3_slv_addr =
c0_pmbus_addr_ctrl3[30:24];
assign out_port_list.c0_pmbus_addr_ctrl3_rsv3_addr_en =
c0_pmbus_addr_ctrl3[31];

logic rx_buf_pop;
//--- pop logic for rx data ----
always_comb
begin
// rx_buf_pop = 0;
//------only for this particular address as up now------
if ((reg_read_address == C0_PMBUS_RX_DBUF_ADDRESS) && arready )
begin
rx_buf_pop = 1;
end
else
rx_buf_pop = 0;
end

//---create pop signal for rx data when firmware writes into the register---
assign out_port_list.rx_data_pop = rx_buf_pop;

logic [31:0] c0_pmbus_rx_dbuf;


//---data from the rx fifo and updating rx buf register----
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)
c0_pmbus_rx_dbuf <= 0;
else if(rx_buf_pop)
c0_pmbus_rx_dbuf <= 32'h0101;//in_port_list.c0_pmbus_rx_dbuf_rx_data;
end

//write logic for register c0_pmbus_tx_buf


logic [31:0] c0_pmbus_tx_buf;
localparam C0_PMBUS_TX_BUF_RESERVED_MASK = 32'hffff_ffff;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_tx_buf <= 32'h0;
else if ((reg_write_address == C0_PMBUS_TX_BUF_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_tx_buf
<= {c0_pmbus_tx_buf[31:8], wdata[7:0]} &
C0_PMBUS_TX_BUF_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_tx_buf <= {c0_pmbus_tx_buf[31:16], wdata[15:0]} &
C0_PMBUS_TX_BUF_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_tx_buf <= {wdata[31:0]} &
C0_PMBUS_TX_BUF_RESERVED_MASK;// 4 byte
endcase
end
end

//assign out_port_list.c0_pmbus_tx_buf_tx_data =
c0_pmbus_tx_buf[31:0];

logic reg_write_d;
logic [31:0] tx_buf_data;
logic tx_buf_data_val;

//------push logic for tx data buffer ------


always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)
reg_write_d <= 0;
else
reg_write_d <= reg_write;
end

//-- tx data logic-----


always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)
begin
tx_buf_data <= 32'b0;
tx_buf_data_val <= 1'b0;
end
else if ( (reg_write_address == C0_PMBUS_TX_BUF_ADDRESS) && reg_write_d
)
begin
tx_buf_data <= c0_pmbus_tx_buf;
tx_buf_data_val <= 1'b1;
end
else
begin
tx_buf_data <= 32'b0;
tx_buf_data_val <= 1'b0;
end
end

//-----push and data for hardware----------


assign out_port_list.tx_buf_tx_data = tx_buf_data[31:0];
assign out_port_list.tx_buf_tx_data_push = tx_buf_data_val;

//write logic for register c0_pmbus_ack_ctrl


logic [31:0] c0_pmbus_ack_ctrl;
localparam C0_PMBUS_ACK_CTRL_RESERVED_MASK = 32'h0000_0001;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_ack_ctrl <= { 31'h0, 1'h0 };
else if ((reg_write_address == C0_PMBUS_ACK_CTRL_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_ack_ctrl <= {c0_pmbus_ack_ctrl[31:8], wdata[7:0]} &
C0_PMBUS_ACK_CTRL_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_ack_ctrl <= {c0_pmbus_ack_ctrl[31:16], wdata[15:0]} &
C0_PMBUS_ACK_CTRL_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_ack_ctrl <= {wdata[31:0]} &
C0_PMBUS_ACK_CTRL_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_ack_ctrl_ack_ctrl = c0_pmbus_ack_ctrl[0];

//write logic for register c0_pmbus_int_mask_ctrl


logic [31:0] c0_pmbus_int_mask_ctrl;
localparam C0_PMBUS_INT_MASK_CTRL_RESERVED_MASK = 32'h00fb_00fb;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_int_mask_ctrl <= { 8'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0,
1'h0, 8'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0, 1'h0 };
else if ((reg_write_address == C0_PMBUS_INT_MASK_CTRL_ADDRESS) && reg_write)
begin

case(awsize)
3'b000: c0_pmbus_int_mask_ctrl <= {c0_pmbus_int_mask_ctrl[31:8], wdata[7:0]}
& C0_PMBUS_INT_MASK_CTRL_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_int_mask_ctrl <= {c0_pmbus_int_mask_ctrl[31:16],
wdata[15:0]} & C0_PMBUS_INT_MASK_CTRL_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_int_mask_ctrl <= {wdata[31:0]}
& C0_PMBUS_INT_MASK_CTRL_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_int_mask_ctrl_stop_f_en =
c0_pmbus_int_mask_ctrl[0];
assign out_port_list.c0_pmbus_int_mask_ctrl_cmd_data_val_f_en=
c0_pmbus_int_mask_ctrl[1];
assign out_port_list.c0_pmbus_int_mask_ctrl_rx_buf_of_f_en =
c0_pmbus_int_mask_ctrl[3];
assign out_port_list.c0_pmbus_int_mask_ctrl_tx_buf_low_f_en =
c0_pmbus_int_mask_ctrl[4];
assign out_port_list.c0_pmbus_int_mask_ctrl_tx_buf_ur_f_en =
c0_pmbus_int_mask_ctrl[5];
assign out_port_list.c0_pmbus_int_mask_ctrl_slv_bsy_f_int =
c0_pmbus_int_mask_ctrl[6];
assign out_port_list.c0_pmbus_int_mask_ctrl_multi_f_int =
c0_pmbus_int_mask_ctrl[7];
assign out_port_list.c0_pmbus_int_mask_ctrl_stop_n_en =
c0_pmbus_int_mask_ctrl[16];
assign out_port_list.c0_pmbus_int_mask_ctrl_cmd_data_val_n_en=
c0_pmbus_int_mask_ctrl[17];
assign out_port_list.c0_pmbus_int_mask_ctrl_rx_buf_of_n_en =
c0_pmbus_int_mask_ctrl[19];
assign out_port_list.c0_pmbus_int_mask_ctrl_tx_buf_low_n_en =
c0_pmbus_int_mask_ctrl[20];
assign out_port_list.c0_pmbus_int_mask_ctrl_tx_buf_ur_n_en =
c0_pmbus_int_mask_ctrl[21];
assign out_port_list.c0_pmbus_int_mask_ctrl_slv_bsy_n_int =
c0_pmbus_int_mask_ctrl[22];
assign out_port_list.c0_pmbus_int_mask_ctrl_multi_n_int =
c0_pmbus_int_mask_ctrl[23];

//write logic for register c0_pmbus_clk_low_to


logic [31:0] c0_pmbus_clk_low_to;
localparam C0_PMBUS_CLK_LOW_TO_RESERVED_MASK = 32'h00ff_ffff;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_pmbus_clk_low_to <= { 8'h0, 24'h0 };
else if ((reg_write_address == C0_PMBUS_CLK_LOW_TO_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_pmbus_clk_low_to <= {c0_pmbus_clk_low_to[31:8], wdata[7:0]}
& C0_PMBUS_CLK_LOW_TO_RESERVED_MASK;// 1 byte
3'b001: c0_pmbus_clk_low_to <= {c0_pmbus_clk_low_to[31:16], wdata[15:0]}
& C0_PMBUS_CLK_LOW_TO_RESERVED_MASK;// 2 byte
3'b010: c0_pmbus_clk_low_to <= {wdata[31:0]}
& C0_PMBUS_CLK_LOW_TO_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_pmbus_clk_low_to_clk_low_to =
c0_pmbus_clk_low_to[23:0];

//write logic for register c0_rail_enable


logic [31:0] c0_rail_enable;
localparam C0_RAIL_ENABLE_RESERVED_MASK = 32'h0000_000f;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_rail_enable <= { 28'h0, 4'h0 };
else if ((reg_write_address == C0_RAIL_ENABLE_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_rail_enable <= {c0_rail_enable[31:8], wdata[7:0]} &
C0_RAIL_ENABLE_RESERVED_MASK;// 1 byte
3'b001: c0_rail_enable <= {c0_rail_enable[31:16], wdata[15:0]} &
C0_RAIL_ENABLE_RESERVED_MASK;// 2 byte
3'b010: c0_rail_enable <= {wdata[31:0]} &
C0_RAIL_ENABLE_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_rail_enable = c0_rail_enable[3:0];

//write logic for register c0_phase_enable


logic [31:0] c0_phase_enable;
localparam C0_PHASE_ENABLE_RESERVED_MASK = 32'h00ff_ffff;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_phase_enable <= { 8'h0, 24'h0 };
else if ((reg_write_address == C0_PHASE_ENABLE_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_phase_enable <= {c0_phase_enable[31:8], wdata[7:0]} &
C0_PHASE_ENABLE_RESERVED_MASK;// 1 byte
3'b001: c0_phase_enable <= {c0_phase_enable[31:16], wdata[15:0]} &
C0_PHASE_ENABLE_RESERVED_MASK;// 2 byte
3'b010: c0_phase_enable <= {wdata[31:0]} &
C0_PHASE_ENABLE_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_phase_enable_phase_en =
c0_phase_enable[23:0];

//write logic for register c0_partition_enable


logic [31:0] c0_partition_enable;
localparam C0_PARTITION_ENABLE_RESERVED_MASK = 32'h0000_003f;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
c0_partition_enable <= { 26'h0, 6'h0 };
else if ((reg_write_address == C0_PARTITION_ENABLE_ADDRESS) && reg_write) begin

case(awsize)
3'b000: c0_partition_enable <= {c0_partition_enable[31:8], wdata[7:0]}
& C0_PARTITION_ENABLE_RESERVED_MASK;// 1 byte
3'b001: c0_partition_enable <= {c0_partition_enable[31:16], wdata[15:0]}
& C0_PARTITION_ENABLE_RESERVED_MASK;// 2 byte
3'b010: c0_partition_enable <= {wdata[31:0]}
& C0_PARTITION_ENABLE_RESERVED_MASK;// 4 byte
endcase
end
end

assign out_port_list.c0_partition_enable_partition_en =
c0_partition_enable[5:0];

//write one to clr enable signals for fast status


logic [31:0] c0_pmbus_sts0;
logic [31:0] c0_pmbus_err_sts0;
logic [31:0] c0_pmbus_sts1;
logic [31:0] c0_pmbus_err_sts1;

//write one to clr enable signals for fast status


/*logic stop_f;
logic cmd_data_avl_f;
logic rx_buf_of_f;
logic tx_buf_low_f;
logic tx_buf_ur_f;
logic slv_busy_f;
logic multi_f;*/

logic stat0_reg_en_f;

logic stop_clr_f;
logic cmd_data_avl_clr_f;
logic rx_buf_of_clr_f;
logic tx_buf_low_clr_f;
logic tx_buf_ur_clr_f;
logic slv_busy_clr_f;
logic multi_clr_f;

logic stop_sc_f_nxt;
logic cmd_data_avl_sc_f_nxt;
logic rx_buf_of_sc_f_nxt;
logic tx_buf_low_sc_f_nxt;
logic tx_buf_ur_sc_f_nxt;
logic slv_busy_sc_f_nxt;
logic multi_sc_f_nxt;

//write one to clr enable signals for normal status


/*logic stop_n;
logic cmd_data_avl_n;
logic rx_buf_of_n;
logic tx_buf_low_n;
logic tx_buf_ur_n;
logic slv_busy_n;
logic multi_n;*/

logic stat1_reg_en_n;

logic stop_clr_n;
logic cmd_data_avl_clr_n;
logic rx_buf_of_clr_n;
logic tx_buf_low_clr_n;
logic tx_buf_ur_clr_n;
logic slv_busy_clr_n;
logic multi_clr_n;

logic stop_sc_n_nxt;
logic cmd_data_avl_sc_n_nxt;
logic rx_buf_of_sc_n_nxt;
logic tx_buf_low_sc_n_nxt;
logic tx_buf_ur_sc_n_nxt;
logic slv_busy_sc_n_nxt;
logic multi_sc_n_nxt;
//----------write one to clear enable signals for the status registers-------
// TODO: Fix this
always_comb begin
/* stop_f = 1'b0;
cmd_data_avl_f = 1'b0;
rx_buf_of_f = 1'b0;
tx_buf_low_f = 1'b0;
tx_buf_ur_f = 1'b0;
slv_busy_f = 1'b0;
multi_f = 1'b0;

stop_n = 1'b0;
cmd_data_avl_n = 1'b0;
rx_buf_of_n = 1'b0;
tx_buf_low_n = 1'b0;
tx_buf_ur_n = 1'b0;
slv_busy_n = 1'b0;
multi_n = 1'b0;*/

stat0_reg_en_f = 1'b0;
stat1_reg_en_n = 1'b0;

if (reg_write) begin
case (reg_write_address)
C0_PMBUS_STS0_ADDRESS: begin
stat0_reg_en_f = 1'b1;
/* stop_f = 1'b1;
cmd_data_avl_f = 1'b1;
rx_buf_of_f = 1'b1;
tx_buf_low_f = 1'b1;
tx_buf_ur_f = 1'b1;
slv_busy_f = 1'b1;
multi_f = 1'b1;*/
end
C0_PMBUS_STS1_ADDRESS: begin
stat1_reg_en_n = 1'b1;
/* stop_n = 1'b1;
cmd_data_avl_n = 1'b1;
rx_buf_of_n = 1'b1;
tx_buf_low_n = 1'b1;
tx_buf_ur_n = 1'b1;
slv_busy_n = 1'b1;
multi_n = 1'b1;*/
end
endcase
end
end

// Write 1 to clear logic for for fast interupt


assign stop_clr_f = reg_write & stat0_reg_en_f ? wdata[0] : 1'b0;
assign cmd_data_avl_clr_f = reg_write & stat0_reg_en_f ? wdata[1] : 1'b0;
assign rx_buf_of_clr_f = reg_write & stat0_reg_en_f ? wdata[3] : 1'b0;
assign tx_buf_low_clr_f = reg_write & stat0_reg_en_f ? wdata[4] : 1'b0;
assign tx_buf_ur_clr_f = reg_write & stat0_reg_en_f ? wdata[5] : 1'b0;
assign slv_busy_clr_f = reg_write & stat0_reg_en_f ? wdata[6] : 1'b0;
assign multi_clr_f = reg_write & stat0_reg_en_f ? wdata[7] : 1'b0;

assign stop_sc_f_nxt = ~stop_clr_f &


(in_port_list.c0_pmbus_sts0_stop_f | c0_pmbus_sts0[0]);
assign cmd_data_avl_sc_f_nxt = ~cmd_data_avl_clr_f &
(in_port_list.c0_pmbus_sts0_cmd_data_avl_f | c0_pmbus_sts0[1]);
assign rx_buf_of_sc_f_nxt = ~rx_buf_of_clr_f &
(in_port_list.c0_pmbus_sts0_rx_buf_of_f | c0_pmbus_sts0[3]);
assign tx_buf_low_sc_f_nxt = ~tx_buf_low_clr_f &
(in_port_list.c0_pmbus_sts0_tx_buf_low_f | c0_pmbus_sts0[4]);
assign tx_buf_ur_sc_f_nxt = ~tx_buf_ur_clr_f &
(in_port_list.c0_pmbus_sts0_tx_buf_ur_f | c0_pmbus_sts0[5]);
assign slv_busy_sc_f_nxt = ~slv_busy_clr_f &
(in_port_list.c0_pmbus_sts0_slv_busy_f | c0_pmbus_sts0[6]);
assign multi_sc_f_nxt = ~multi_clr_f &
(in_port_list.c0_pmbus_sts0_multi_f | c0_pmbus_sts0[7]);

// Write 1 to clear logic for for normal interupt


assign stop_clr_n = reg_write & stat1_reg_en_n ? wdata[0] : 1'b0;
assign cmd_data_avl_clr_n = reg_write & stat1_reg_en_n ? wdata[1] : 1'b0;
assign rx_buf_of_clr_n = reg_write & stat1_reg_en_n ? wdata[3] : 1'b0;
assign tx_buf_low_clr_n = reg_write & stat1_reg_en_n ? wdata[4] : 1'b0;
assign tx_buf_ur_clr_n = reg_write & stat1_reg_en_n ? wdata[5] : 1'b0;
assign slv_busy_clr_n = reg_write & stat1_reg_en_n ? wdata[6] : 1'b0;
assign multi_clr_n = reg_write & stat1_reg_en_n ? wdata[7] : 1'b0;

assign stop_sc_n_nxt = ~stop_clr_n &


(in_port_list.c0_pmbus_sts1_stop_n | c0_pmbus_sts1[0]);
assign cmd_data_avl_sc_n_nxt = ~cmd_data_avl_clr_n &
(in_port_list.c0_pmbus_sts1_cmd_data_avl_n | c0_pmbus_sts1[1]);
assign rx_buf_of_sc_n_nxt = ~rx_buf_of_clr_n &
(in_port_list.c0_pmbus_sts1_rx_buf_of_n | c0_pmbus_sts1[3]);
assign tx_buf_low_sc_n_nxt = ~tx_buf_low_clr_n &
(in_port_list.c0_pmbus_sts1_tx_buf_low_n | c0_pmbus_sts1[4]);
assign tx_buf_ur_sc_n_nxt = ~tx_buf_ur_clr_n &
(in_port_list.c0_pmbus_sts1_tx_buf_ur_n | c0_pmbus_sts1[5]);
assign slv_busy_sc_n_nxt = ~slv_busy_clr_n &
(in_port_list.c0_pmbus_sts1_slv_busy_n | c0_pmbus_sts1[6]);
assign multi_sc_n_nxt = ~multi_clr_n &
(in_port_list.c0_pmbus_sts1_multi_n | c0_pmbus_sts1[7]);

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n) begin
c0_pmbus_sts0[0] <= 1'b0;
c0_pmbus_sts0[1] <= 1'b0;
c0_pmbus_sts0[2] <= 1'b0;
c0_pmbus_sts0[3] <= 1'b0;
c0_pmbus_sts0[4] <= 1'b0;
c0_pmbus_sts0[5] <= 1'b0;
c0_pmbus_sts0[6] <= 1'b0;
c0_pmbus_sts0[7] <= 1'b0;
end
else begin
c0_pmbus_sts0[0] <= stop_sc_f_nxt;
c0_pmbus_sts0[1] <= cmd_data_avl_sc_f_nxt;
c0_pmbus_sts0[2] <= 1'b0;// TODO: Rsvd
c0_pmbus_sts0[3] <= rx_buf_of_sc_f_nxt;
c0_pmbus_sts0[4] <= tx_buf_low_sc_f_nxt;
c0_pmbus_sts0[5] <= tx_buf_ur_sc_f_nxt;
c0_pmbus_sts0[6] <= slv_busy_sc_f_nxt;
c0_pmbus_sts0[7] <= multi_sc_f_nxt;
end
end

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n) begin
c0_pmbus_sts1[0] <= 1'b0;
c0_pmbus_sts1[1] <= 1'b0;
c0_pmbus_sts1[2] <= 1'b0;
c0_pmbus_sts1[3] <= 1'b0;
c0_pmbus_sts1[4] <= 1'b0;
c0_pmbus_sts1[5] <= 1'b0;
c0_pmbus_sts1[6] <= 1'b0;
c0_pmbus_sts1[7] <= 1'b0;
end
else begin
c0_pmbus_sts1[0] <= stop_sc_n_nxt;
c0_pmbus_sts1[1] <= cmd_data_avl_sc_n_nxt;
c0_pmbus_sts1[2] <= 1'b0;// TODO: Rsvd
c0_pmbus_sts1[3] <= rx_buf_of_sc_n_nxt;
c0_pmbus_sts1[4] <= tx_buf_low_sc_n_nxt;
c0_pmbus_sts1[5] <= tx_buf_ur_sc_n_nxt;
c0_pmbus_sts1[6] <= slv_busy_sc_n_nxt;
c0_pmbus_sts1[7] <= multi_sc_n_nxt;
end
end

//replication of hardware signals for normal status register


assign c0_pmbus_sts0[8] = in_port_list.c0_pmbus_sts0_cmd_val_f;
assign c0_pmbus_sts0[9] = in_port_list.c0_pmbus_sts0_data_avl_f;
assign c0_pmbus_sts0[10] = in_port_list.c0_pmbus_sts0_rpt_start_val_f;
assign c0_pmbus_sts0[11] = in_port_list.c0_pmbus_sts0_ext_cmd_val_f;
assign c0_pmbus_sts0[12] = in_port_list.c0_pmbus_sts0_rd_val_f;
assign c0_pmbus_sts0[13] = in_port_list.c0_pmbus_sts0_err_det_f;
assign c0_pmbus_sts0[15:14] = in_port_list.c0_pmbus_sts0_pg_det_f;
assign c0_pmbus_sts0[18:16] = in_port_list.c0_pmbus_sts0_rx_data_buf_fill_cnt_f;
assign c0_pmbus_sts0[21:19] = in_port_list.c0_pmbus_sts0_tx_data_buf_fill_cnt_f;
assign c0_pmbus_sts0[23:22] = 2'b0;
assign c0_pmbus_sts0[31:24] = in_port_list.c0_pmbus_sts0_cmd_f;

assign c0_pmbus_sts1[8] = in_port_list.c0_pmbus_sts1_cmd_val_n;


assign c0_pmbus_sts1[9] = in_port_list.c0_pmbus_sts1_data_avl_n;
assign c0_pmbus_sts1[10] = in_port_list.c0_pmbus_sts1_rpt_start_val_n;
assign c0_pmbus_sts1[11] = in_port_list.c0_pmbus_sts1_ext_cmd_val_n;
assign c0_pmbus_sts1[12] = in_port_list.c0_pmbus_sts1_rd_val_n;
assign c0_pmbus_sts1[13] = in_port_list.c0_pmbus_sts1_err_det_n;
assign c0_pmbus_sts1[15:14] = in_port_list.c0_pmbus_sts1_pg_det_n;
assign c0_pmbus_sts1[18:16] = in_port_list.c0_pmbus_sts1_rx_data_buf_fill_cnt_n;
assign c0_pmbus_sts1[21:19] = in_port_list.c0_pmbus_sts1_tx_data_buf_fill_cnt_n;
assign c0_pmbus_sts1[23:22] = 2'b0;
assign c0_pmbus_sts1[31:24] = in_port_list.c0_pmbus_sts1_cmd_n;

//replication of hardware signals for fast error status register


assign c0_pmbus_err_sts0[0] = in_port_list.c0_pmbus_err_sts0_pec_err_f;
assign c0_pmbus_err_sts0[1] = in_port_list.c0_pmbus_err_sts0_cmd_err_f;
assign c0_pmbus_err_sts0[2] = in_port_list.c0_pmbus_err_sts0_oth_err_f;
assign c0_pmbus_err_sts0[5:3] = in_port_list.c0_pmbus_err_sts0_misc_err_enc_f;
assign c0_pmbus_err_sts0[7:6] = 2'b0;
assign c0_pmbus_err_sts0[10:8] = in_port_list.c0_pmbus_err_sts0_to_enc_f;
assign c0_pmbus_err_sts0[11] = in_port_list.c0_pmbus_err_sts0_ara_f;
assign c0_pmbus_err_sts0[31:12] = 20'b0;
//replication of hardware signals for normal error status register
assign c0_pmbus_err_sts1[0] = in_port_list.c0_pmbus_err_sts1_pec_err_n;
assign c0_pmbus_err_sts1[1] = in_port_list.c0_pmbus_err_sts1_cmd_err_n;
assign c0_pmbus_err_sts1[2] = in_port_list.c0_pmbus_err_sts1_oth_err_n;
assign c0_pmbus_err_sts1[5:3] = in_port_list.c0_pmbus_err_sts1_misc_err_enc_n;
assign c0_pmbus_err_sts1[7:6] = 2'b0;
assign c0_pmbus_err_sts1[10:8] = in_port_list.c0_pmbus_err_sts1_to_enc_n;
assign c0_pmbus_err_sts1[11] = in_port_list.c0_pmbus_err_sts1_ara_n;
assign c0_pmbus_err_sts1[31:12] = 20'b0;

logic [31:0] reg_data_out_nxt;


always_comb begin
reg_data_out_nxt = {DW{1'b0}};
if(reg_read) begin
case(reg_read_address)
C0_PMBUS_CTRL0_ADDRESS : reg_data_out_nxt = c0_pmbus_ctrl0
[31:0];
C0_PMBUS_CTRL1_ADDRESS : reg_data_out_nxt = c0_pmbus_ctrl1
[31:0];
C0_PMBUS_CTRL2_ADDRESS : reg_data_out_nxt = c0_pmbus_ctrl2
[31:0];
C0_PMBUS_CTRL3_ADDRESS : reg_data_out_nxt = c0_pmbus_ctrl3
[31:0];
C0_PMBUS_ADDR_CTRL0_ADDRESS : reg_data_out_nxt = c0_pmbus_addr_ctrl0
[31:0];
C0_PMBUS_ADDR_CTRL1_ADDRESS : reg_data_out_nxt = c0_pmbus_addr_ctrl1
[31:0];
C0_PMBUS_ADDR_CTRL2_ADDRESS : reg_data_out_nxt = c0_pmbus_addr_ctrl2
[31:0];
C0_PMBUS_ADDR_CTRL3_ADDRESS : reg_data_out_nxt = c0_pmbus_addr_ctrl3
[31:0];
C0_PMBUS_STS0_ADDRESS : reg_data_out_nxt = c0_pmbus_sts0
[31:0];
C0_PMBUS_ERR_STS0_ADDRESS : reg_data_out_nxt = c0_pmbus_err_sts0
[31:0];
C0_PMBUS_STS1_ADDRESS : reg_data_out_nxt = c0_pmbus_sts1
[31:0];
C0_PMBUS_ERR_STS1_ADDRESS : reg_data_out_nxt = c0_pmbus_err_sts1
[31:0];
C0_PMBUS_RX_DBUF_ADDRESS : reg_data_out_nxt = c0_pmbus_rx_dbuf
[31:0];
//C0_PMBUS_TX_BUF_ADDRESS : reg_data_out_nxt = c0_pmbus_tx_buf
[31:0];
C0_PMBUS_ACK_CTRL_ADDRESS : reg_data_out_nxt = c0_pmbus_ack_ctrl
[31:0];
C0_PMBUS_INT_MASK_CTRL_ADDRESS: reg_data_out_nxt =
c0_pmbus_int_mask_ctrl[31:0];
C0_PMBUS_CLK_LOW_TO_ADDRESS : reg_data_out_nxt = c0_pmbus_clk_low_to
[31:0];
C0_RAIL_ENABLE_ADDRESS : reg_data_out_nxt = c0_rail_enable
[31:0];
C0_PHASE_ENABLE_ADDRESS : reg_data_out_nxt = c0_phase_enable
[31:0];
C0_PARTITION_ENABLE_ADDRESS : reg_data_out_nxt = c0_partition_enable
[31:0];
endcase
end
end
// TODO: check if we need to call mask or enable
assign fast_int = |{~c0_pmbus_int_mask_ctrl[7:0] & c0_pmbus_sts0[7:0]};
assign norm_int = |{~c0_pmbus_int_mask_ctrl[23:15] & c0_pmbus_sts1[7:0]};

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n) begin
cmd_lut_0_rd_en_o_d <= 1'b0;
cmd_lut_1_rd_en_o_d <= 1'b0;
end
else
begin
cmd_lut_0_rd_en_o_d <= cmd_lut_0_rd_en_o;
cmd_lut_1_rd_en_o_d <= cmd_lut_1_rd_en_o;
end
end
reg [31:0]rdata_buf;
assign rdata = rvalid ? rdata_buf : 32'b0;

always_ff @(posedge clk or negedge rst_n) begin


if (!rst_n)
rdata_buf <= {DW{1'b0}};
else if(rvalid && !rready)
rdata_buf <= rdata_buf;
else begin
// FW Read CMD LUT 0
if (cmd_lut_0_rd_en_o_d ) //& !hw_cmd_lut_0_rd_en_d & !
hw_cmd_lut_1_rd_en_d) // TODO: fix this
rdata_buf <= cmd_lut_0_rd_data_i;
// FW Read CMD LUT 0
else if (cmd_lut_1_rd_en_o_d) //& !hw_cmd_lut_0_rd_en_d & !
hw_cmd_lut_1_rd_en_d) // TODO: fix this no need of unnecessary even data there in
rdata rvalid wont be there so rvalid validates data
rdata_buf <= cmd_lut_1_rd_data_i;
else begin
case(arsize)
3'b000: rdata_buf <= reg_data_out_nxt & 32'h0000_00ff;
3'b001: rdata_buf <= reg_data_out_nxt & 32'h0000_ffff;
3'b010: rdata_buf <= reg_data_out_nxt & 32'hffff_ffff;
endcase
end
end
end

/*
always_ff @(posedge clk or negedge rst_n) begin
if (!rst_n)
rdata <= {DW{1'b0}};
else if(rvalid)begin
case(arsize)
3'b000: rdata <= reg_data_out_nxt & 32'h0000_00ff;
3'b001: rdata <= reg_data_out_nxt & 32'h0000_ffff;
3'b010: rdata <= reg_data_out_nxt & 32'hffff_ffff;
endcase
*//*if(rvalid && !rready)
rdata <= rdata;
else *//* begin
// FW Read CMD LUT 0
if (cmd_lut_0_rd_en_o_d ) //& !hw_cmd_lut_0_rd_en_d & !
hw_cmd_lut_1_rd_en_d) // TODO: fix this
rdata <= cmd_lut_0_rd_data_i;
// FW Read CMD LUT 0
else if (cmd_lut_1_rd_en_o_d) //& !hw_cmd_lut_0_rd_en_d & !
hw_cmd_lut_1_rd_en_d) // TODO: fix this no need of unnecessary even data there in
rdata rvalid wont be there so rvalid validates data
rdata <= cmd_lut_1_rd_data_i;
end
end
else
rdata <= {DW{1'b0}};
end*/

endmodule

You might also like