blob: acdb04570369c7eede01c7dc5ef2030ea7eb63c6 [file] [log] [blame]
shalanfd13eb52020-08-21 16:48:07 +02001module sysctrl_wb #(
Tim Edwards32d05422020-10-19 19:43:52 -04002 parameter BASE_ADR = 32'h2F00_0000,
3 parameter PWRGOOD = 8'h00,
4 parameter CLK_OUT = 8'h04,
5 parameter TRAP_OUT = 8'h08,
6 parameter IRQ_SRC = 8'h0c
shalanfd13eb52020-08-21 16:48:07 +02007) (
8 input wb_clk_i,
9 input wb_rst_i,
10
11 input [31:0] wb_dat_i,
12 input [31:0] wb_adr_i,
13 input [3:0] wb_sel_i,
14 input wb_cyc_i,
15 input wb_stb_i,
16 input wb_we_i,
17
18 output [31:0] wb_dat_o,
19 output wb_ack_o,
20
Tim Edwards32d05422020-10-19 19:43:52 -040021 input usr1_pwrgood,
22 input usr2_pwrgood,
23 output clk1_output_dest,
24 output clk2_output_dest,
Tim Edwardsef8312e2020-09-22 17:20:06 -040025 output trap_output_dest,
Tim Edwards32d05422020-10-19 19:43:52 -040026 output irq_7_inputsrc,
27 output irq_8_inputsrc
shalanfd13eb52020-08-21 16:48:07 +020028
29);
30
31 wire resetn;
32 wire valid;
33 wire ready;
34 wire [3:0] iomem_we;
35
36 assign resetn = ~wb_rst_i;
37 assign valid = wb_stb_i && wb_cyc_i;
38
39 assign iomem_we = wb_sel_i & {4{wb_we_i}};
40 assign wb_ack_o = ready;
41
42 sysctrl #(
43 .BASE_ADR(BASE_ADR),
Tim Edwards32d05422020-10-19 19:43:52 -040044 .PWRGOOD(PWRGOOD),
45 .CLK_OUT(CLK_OUT),
shalanfd13eb52020-08-21 16:48:07 +020046 .TRAP_OUT(TRAP_OUT),
Tim Edwards32d05422020-10-19 19:43:52 -040047 .IRQ_SRC(IRQ_SRC)
shalanfd13eb52020-08-21 16:48:07 +020048 ) sysctrl (
49 .clk(wb_clk_i),
50 .resetn(resetn),
51
shalanfd13eb52020-08-21 16:48:07 +020052 .iomem_addr(wb_adr_i),
53 .iomem_valid(valid),
54 .iomem_wstrb(iomem_we),
55 .iomem_wdata(wb_dat_i),
56 .iomem_rdata(wb_dat_o),
57 .iomem_ready(ready),
58
Tim Edwards32d05422020-10-19 19:43:52 -040059 .usr1_pwrgood(usr1_pwrgood),
60 .usr2_pwrgood(usr2_pwrgood),
61 .clk1_output_dest(clk1_output_dest),
62 .clk2_output_dest(clk2_output_dest),
shalanfd13eb52020-08-21 16:48:07 +020063 .trap_output_dest(trap_output_dest),
Tim Edwards32d05422020-10-19 19:43:52 -040064 .irq_8_inputsrc(irq_8_inputsrc),
Tim Edwards04ba17f2020-10-02 22:27:50 -040065 .irq_7_inputsrc(irq_7_inputsrc)
shalanfd13eb52020-08-21 16:48:07 +020066 );
67
68endmodule
69
70module sysctrl #(
71 parameter BASE_ADR = 32'h2300_0000,
Tim Edwards32d05422020-10-19 19:43:52 -040072 parameter PWRGOOD = 8'h00,
73 parameter CLK_OUT = 8'h04,
74 parameter TRAP_OUT = 8'h08,
75 parameter IRQ_SRC = 8'h0c
shalanfd13eb52020-08-21 16:48:07 +020076) (
77 input clk,
78 input resetn,
79
shalanfd13eb52020-08-21 16:48:07 +020080 input [31:0] iomem_addr,
81 input iomem_valid,
82 input [3:0] iomem_wstrb,
83 input [31:0] iomem_wdata,
84 output reg [31:0] iomem_rdata,
85 output reg iomem_ready,
86
Tim Edwards32d05422020-10-19 19:43:52 -040087 input usr1_pwrgood,
88 input usr2_pwrgood,
89 output clk1_output_dest,
90 output clk2_output_dest,
Tim Edwardsef8312e2020-09-22 17:20:06 -040091 output trap_output_dest,
Tim Edwards32d05422020-10-19 19:43:52 -040092 output irq_7_inputsrc,
93 output irq_8_inputsrc
shalanfd13eb52020-08-21 16:48:07 +020094);
shalanfd13eb52020-08-21 16:48:07 +020095
Tim Edwards32d05422020-10-19 19:43:52 -040096 reg clk1_output_dest;
97 reg clk2_output_dest;
Tim Edwardsef8312e2020-09-22 17:20:06 -040098 reg trap_output_dest;
99 reg irq_7_inputsrc;
Tim Edwards32d05422020-10-19 19:43:52 -0400100 reg irq_8_inputsrc;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400101
Tim Edwards32d05422020-10-19 19:43:52 -0400102 wire usr1_pwrgood;
103 wire usr2_pwrgood;
104
105 assign pwrgood_sel = (iomem_addr[7:0] == PWRGOOD);
106 assign clk_out_sel = (iomem_addr[7:0] == CLK_OUT);
shalanfd13eb52020-08-21 16:48:07 +0200107 assign trap_out_sel = (iomem_addr[7:0] == TRAP_OUT);
Tim Edwards32d05422020-10-19 19:43:52 -0400108 assign irq_sel = (iomem_addr[7:0] == IRQ_SRC);
shalanfd13eb52020-08-21 16:48:07 +0200109
shalanfd13eb52020-08-21 16:48:07 +0200110 always @(posedge clk) begin
111 if (!resetn) begin
Tim Edwards32d05422020-10-19 19:43:52 -0400112 clk1_output_dest <= 0;
113 clk2_output_dest <= 0;
shalanfd13eb52020-08-21 16:48:07 +0200114 trap_output_dest <= 0;
115 irq_7_inputsrc <= 0;
Tim Edwards32d05422020-10-19 19:43:52 -0400116 irq_8_inputsrc <= 0;
shalanfd13eb52020-08-21 16:48:07 +0200117 end else begin
118 iomem_ready <= 0;
119 if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
120 iomem_ready <= 1'b 1;
121
Tim Edwards32d05422020-10-19 19:43:52 -0400122 if (pwrgood_sel) begin
123 iomem_rdata <= {30'd0, usr2_pwrgood, usr1_pwrgood};
124 // These are read-only bits; no write behavior on wstrb.
125
126 end else if (clk_out_sel) begin
127 iomem_rdata <= {30'd0, clk2_output_dest, clk1_output_dest};
128 if (iomem_wstrb[0]) begin
129 clk1_output_dest <= iomem_wdata[0];
130 clk2_output_dest <= iomem_wdata[1];
131 end
shalanfd13eb52020-08-21 16:48:07 +0200132
133 end else if (trap_out_sel) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400134 iomem_rdata <= {31'd0, trap_output_dest};
shalanfd13eb52020-08-21 16:48:07 +0200135 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400136 trap_output_dest <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200137
Tim Edwards32d05422020-10-19 19:43:52 -0400138 end else if (irq_sel) begin
139 iomem_rdata <= {30'd0, irq_8_inputsrc, irq_7_inputsrc};
140 if (iomem_wstrb[0]) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400141 irq_7_inputsrc <= iomem_wdata[0];
Tim Edwards32d05422020-10-19 19:43:52 -0400142 irq_8_inputsrc <= iomem_wdata[1];
143 end
shalanfd13eb52020-08-21 16:48:07 +0200144 end
145 end
146 end
147 end
148
Tim Edwardsef8312e2020-09-22 17:20:06 -0400149endmodule