
`timescale 1ns / 100 ps

module sw_ctrlstat (
    clk,
    rstn,

    usi_rdata,
    usi_ack,
    usi_wdata,
    usi_addr,
    usi_rdy,
    usi_wr_n,
    
    rev_id,
    rx_disp_err_detect_0, 
    rx_cv_detect_0, 
    errorcnt,
    sw_inj_err_n,
    sw_clear_err_n
);

input    clk ;
input    rstn ;

output [35:0] usi_rdata ;
output        usi_ack ;
input  [35:0] usi_wdata ;
input  [17:0] usi_addr ;
input         usi_rdy ;
input         usi_wr_n ;

input  [7:0]  rev_id ;
input  [7:0]  errorcnt ;
input   rx_disp_err_detect_0, rx_cv_detect_0;
output   sw_inj_err_n, sw_clear_err_n;






reg  [7:0] rdata;      reg  rdata_par;
wire [7:0] rdata_800; wire rdata_par_800;
wire [7:0] rdata_801; wire rdata_par_801;
wire [7:0] rdata_802; wire rdata_par_802;
wire [7:0] rdata_803; wire rdata_par_803;
wire [7:0] rdata_804; wire rdata_par_804;
wire [7:0] rdata_805; wire rdata_par_805;
wire [7:0] rdata_806; wire rdata_par_806;
wire [7:0] rdata_807; wire rdata_par_807;
wire [7:0] rdata_808; wire rdata_par_808;
wire [7:0] rdata_809; wire rdata_par_809;
wire [7:0] rdata_80a; wire rdata_par_80a;
wire [7:0] rdata_80b; wire rdata_par_80b;
wire [7:0] rdata_80c; wire rdata_par_80c;
wire [7:0] rdata_80d; wire rdata_par_80d;
wire [7:0] rdata_80e; wire rdata_par_80e;
wire [7:0] rdata_80f; wire rdata_par_80f;
wire [7:0] rdata_810; wire rdata_par_810;
wire [7:0] rdata_811; wire rdata_par_811;
wire [7:0] rdata_812; wire rdata_par_812;
wire [7:0] rdata_813; wire rdata_par_813;
wire [7:0] rdata_814; wire rdata_par_814;
wire [7:0] rdata_815; wire rdata_par_815;
wire [7:0] rdata_816; wire rdata_par_816;
wire [7:0] rdata_817; wire rdata_par_817;
wire [7:0] rdata_818; wire rdata_par_818;
wire [7:0] rdata_819; wire rdata_par_819;
wire [7:0] rdata_81a; wire rdata_par_81a;
wire [7:0] rdata_81b; wire rdata_par_81b;
wire [7:0] rdata_81c; wire rdata_par_81c;
wire [7:0] rdata_81d; wire rdata_par_81d;
wire [7:0] rdata_81e; wire rdata_par_81e;
wire [7:0] rdata_81f; wire rdata_par_81f;
wire [7:0] rdata_820; wire rdata_par_820;
wire [7:0] rdata_821; wire rdata_par_821;
wire [7:0] rdata_822; wire rdata_par_822;
wire [7:0] rdata_823; wire rdata_par_823;
wire [7:0] rdata_824; wire rdata_par_824;
wire [7:0] rdata_825; wire rdata_par_825;
wire [7:0] rdata_826; wire rdata_par_826;
wire [7:0] rdata_827; wire rdata_par_827;
wire [7:0] rdata_828; wire rdata_par_828;
wire [7:0] rdata_829; wire rdata_par_829;
wire [7:0] rdata_82a; wire rdata_par_82a;
wire [7:0] rdata_82b; wire rdata_par_82b;
wire [7:0] rdata_82c; wire rdata_par_82c;
wire [7:0] rdata_82d; wire rdata_par_82d;
wire [7:0] rdata_82e; wire rdata_par_82e;
wire [7:0] rdata_82f; wire rdata_par_82f;



wire [7:0] wdata ;
reg usi_ack ;

assign wdata = (usi_wdata[7:0]) ;

// Terminate the USI 
always @(negedge rstn or posedge clk)
begin
  if (~rstn)
  begin
      usi_ack <= 1'b0 ;
  end
  else if (usi_rdy)
  begin
    usi_ack <= usi_rdy ;
  end
  else
  begin
    usi_ack <= 1'b0 ;
  end
end


//Revision ID_register for software to check the FPGA design revision.
softreg_r reg800 (
  .address(18'h0800),
  .usi_addr(usi_addr),
  .rdy(usi_rdy),
  .wr_n(usi_wr_n),
  .rdata(rdata_800),
  .rdata_par(rdata_par_800),
  .data({rev_id[0],
         rev_id[1],
         rev_id[2],
         rev_id[3],
         rev_id[4],
         rev_id[5],
         rev_id[6],
         rev_id[7]})
);

softreg_r reg801 (
  .address(18'h0801),
  .usi_addr(usi_addr),
  .rdy(usi_rdy),
  .wr_n(usi_wr_n),
  .rdata(rdata_801),
  .rdata_par(rdata_par_801),
  .data({rx_disp_err_detect_0,
         1'b0,
         1'b0,
         1'b0,
         rx_cv_detect_0,
         1'b0,
         1'b0,
         1'b0})         
);

softreg_r reg802 (
  .address(18'h0802),
  .usi_addr(usi_addr),
  .rdy(usi_rdy),
  .wr_n(usi_wr_n),
  .rdata(rdata_802),
  .rdata_par(rdata_par_802),
  .data({errorcnt[0],errorcnt[1],errorcnt[2],errorcnt[3],
  	errorcnt[4],errorcnt[5],errorcnt[6],errorcnt[7]})         
);

softreg_rw reg803 (
.address(18'h0803),
 .clk(clk), 
 .reset_value(8'hFF), 
 .rstn(rstn), 
 .usi_addr(usi_addr), 
  .rdy(usi_rdy),
  .wr_n(usi_wr_n),
 .wdata(wdata), 
 .rdata(rdata_803),
 .rdata_par(rdata_par_803), 
 .data({OPEN,OPEN,OPEN,OPEN,OPEN,OPEN,sw_clear_err_n, sw_inj_err_n})
 );

  
 


always @ (posedge clk)
begin
  if (usi_rdy) 
  begin
    case (usi_addr)
    18'h0800 : begin rdata <= rdata_800; rdata_par <= rdata_par_800; end
    18'h0801 : begin rdata <= rdata_801; rdata_par <= rdata_par_801; end
    18'h0802 : begin rdata <= rdata_802; rdata_par <= rdata_par_802; end
    18'h0803 : begin rdata <= rdata_803; rdata_par <= rdata_par_803; end
    18'h0804 : begin rdata <= rdata_804; rdata_par <= rdata_par_804; end
    18'h0805 : begin rdata <= rdata_805; rdata_par <= rdata_par_805; end
    18'h0806 : begin rdata <= rdata_806; rdata_par <= rdata_par_806; end
    18'h0807 : begin rdata <= rdata_807; rdata_par <= rdata_par_807; end
    18'h0808 : begin rdata <= rdata_808; rdata_par <= rdata_par_808; end
    18'h0809 : begin rdata <= rdata_809; rdata_par <= rdata_par_809; end
    18'h080a : begin rdata <= rdata_80a; rdata_par <= rdata_par_80a; end
    18'h080b : begin rdata <= rdata_80b; rdata_par <= rdata_par_80b; end
    18'h080c : begin rdata <= rdata_80c; rdata_par <= rdata_par_80c; end
    18'h080d : begin rdata <= rdata_80d; rdata_par <= rdata_par_80d; end
    18'h080e : begin rdata <= rdata_80e; rdata_par <= rdata_par_80e; end
    18'h080f : begin rdata <= rdata_80f; rdata_par <= rdata_par_80f; end
    18'h0810 : begin rdata <= rdata_810; rdata_par <= rdata_par_810; end
    18'h0811 : begin rdata <= rdata_811; rdata_par <= rdata_par_811; end
    18'h0812 : begin rdata <= rdata_812; rdata_par <= rdata_par_812; end
    18'h0813 : begin rdata <= rdata_813; rdata_par <= rdata_par_813; end
    18'h0814 : begin rdata <= rdata_814; rdata_par <= rdata_par_814; end
    18'h0815 : begin rdata <= rdata_815; rdata_par <= rdata_par_815; end
    18'h0816 : begin rdata <= rdata_816; rdata_par <= rdata_par_816; end
    18'h0817 : begin rdata <= rdata_817; rdata_par <= rdata_par_817; end
    18'h0818 : begin rdata <= rdata_818; rdata_par <= rdata_par_818; end
    18'h0819 : begin rdata <= rdata_819; rdata_par <= rdata_par_819; end
    18'h081a : begin rdata <= rdata_81a; rdata_par <= rdata_par_81a; end
    18'h081b : begin rdata <= rdata_81b; rdata_par <= rdata_par_81b; end
    18'h081c : begin rdata <= rdata_81c; rdata_par <= rdata_par_81c; end
    18'h081d : begin rdata <= rdata_81d; rdata_par <= rdata_par_81d; end
    18'h081e : begin rdata <= rdata_81e; rdata_par <= rdata_par_81e; end
    18'h081f : begin rdata <= rdata_81f; rdata_par <= rdata_par_81f; end
    18'h0820 : begin rdata <= rdata_820; rdata_par <= rdata_par_820; end
    18'h0821 : begin rdata <= rdata_821; rdata_par <= rdata_par_821; end
    18'h0822 : begin rdata <= rdata_822; rdata_par <= rdata_par_822; end
    18'h0823 : begin rdata <= rdata_823; rdata_par <= rdata_par_823; end
    18'h0824 : begin rdata <= rdata_824; rdata_par <= rdata_par_824; end
    18'h0825 : begin rdata <= rdata_825; rdata_par <= rdata_par_825; end
    18'h0826 : begin rdata <= rdata_826; rdata_par <= rdata_par_826; end
    18'h0827 : begin rdata <= rdata_827; rdata_par <= rdata_par_827; end
    18'h0828 : begin rdata <= rdata_828; rdata_par <= rdata_par_828; end
    18'h0829 : begin rdata <= rdata_829; rdata_par <= rdata_par_829; end
    18'h082a : begin rdata <= rdata_82a; rdata_par <= rdata_par_82a; end
    18'h082b : begin rdata <= rdata_82b; rdata_par <= rdata_par_82b; end
    18'h082c : begin rdata <= rdata_82c; rdata_par <= rdata_par_82c; end
    18'h082d : begin rdata <= rdata_82d; rdata_par <= rdata_par_82d; end
    18'h082e : begin rdata <= rdata_82e; rdata_par <= rdata_par_82e; end
    18'h082f : begin rdata <= rdata_82f; rdata_par <= rdata_par_82f; end
    
    default  : begin rdata <= rdata_800; rdata_par <= rdata_par_800; end
    endcase
  end
end  

// Read data should be broadcast to all 4 lanes of the 32-bit word
assign usi_rdata = {rdata_par, rdata_par, rdata_par, rdata_par, rdata, rdata, rdata, rdata};



endmodule