blob: 7f11f75940e3125bb4ea49d5ed960245ccda820b [file] [log] [blame]
Matt Venn08cd6eb2020-11-16 12:01:14 +01001`default_nettype none
shalanfd13eb52020-08-21 16:48:07 +02002module sysctrl_wb #(
Tim Edwards32d05422020-10-19 19:43:52 -04003 parameter BASE_ADR = 32'h2F00_0000,
4 parameter PWRGOOD = 8'h00,
5 parameter CLK_OUT = 8'h04,
6 parameter TRAP_OUT = 8'h08,
7 parameter IRQ_SRC = 8'h0c
shalanfd13eb52020-08-21 16:48:07 +02008) (
9 input wb_clk_i,
10 input wb_rst_i,
11
12 input [31:0] wb_dat_i,
13 input [31:0] wb_adr_i,
14 input [3:0] wb_sel_i,
15 input wb_cyc_i,
16 input wb_stb_i,
17 input wb_we_i,
18
19 output [31:0] wb_dat_o,
20 output wb_ack_o,
21
Tim Edwards05ad4fc2020-10-19 22:12:33 -040022 input usr1_vcc_pwrgood,
23 input usr2_vcc_pwrgood,
24 input usr1_vdd_pwrgood,
25 input usr2_vdd_pwrgood,
Tim Edwards32d05422020-10-19 19:43:52 -040026 output clk1_output_dest,
27 output clk2_output_dest,
Tim Edwardsef8312e2020-09-22 17:20:06 -040028 output trap_output_dest,
Tim Edwards32d05422020-10-19 19:43:52 -040029 output irq_7_inputsrc,
30 output irq_8_inputsrc
shalanfd13eb52020-08-21 16:48:07 +020031
32);
33
34 wire resetn;
35 wire valid;
36 wire ready;
37 wire [3:0] iomem_we;
38
39 assign resetn = ~wb_rst_i;
40 assign valid = wb_stb_i && wb_cyc_i;
41
42 assign iomem_we = wb_sel_i & {4{wb_we_i}};
43 assign wb_ack_o = ready;
44
45 sysctrl #(
46 .BASE_ADR(BASE_ADR),
Tim Edwards32d05422020-10-19 19:43:52 -040047 .PWRGOOD(PWRGOOD),
48 .CLK_OUT(CLK_OUT),
shalanfd13eb52020-08-21 16:48:07 +020049 .TRAP_OUT(TRAP_OUT),
Tim Edwards32d05422020-10-19 19:43:52 -040050 .IRQ_SRC(IRQ_SRC)
shalanfd13eb52020-08-21 16:48:07 +020051 ) sysctrl (
52 .clk(wb_clk_i),
53 .resetn(resetn),
54
shalanfd13eb52020-08-21 16:48:07 +020055 .iomem_addr(wb_adr_i),
56 .iomem_valid(valid),
57 .iomem_wstrb(iomem_we),
58 .iomem_wdata(wb_dat_i),
59 .iomem_rdata(wb_dat_o),
60 .iomem_ready(ready),
61
Tim Edwards05ad4fc2020-10-19 22:12:33 -040062 .usr1_vcc_pwrgood(usr1_vcc_pwrgood),
63 .usr2_vcc_pwrgood(usr2_vcc_pwrgood),
64 .usr1_vdd_pwrgood(usr1_vdd_pwrgood),
65 .usr2_vdd_pwrgood(usr2_vdd_pwrgood),
Tim Edwards32d05422020-10-19 19:43:52 -040066 .clk1_output_dest(clk1_output_dest),
67 .clk2_output_dest(clk2_output_dest),
shalanfd13eb52020-08-21 16:48:07 +020068 .trap_output_dest(trap_output_dest),
Tim Edwards32d05422020-10-19 19:43:52 -040069 .irq_8_inputsrc(irq_8_inputsrc),
Tim Edwards04ba17f2020-10-02 22:27:50 -040070 .irq_7_inputsrc(irq_7_inputsrc)
shalanfd13eb52020-08-21 16:48:07 +020071 );
72
73endmodule
74
75module sysctrl #(
76 parameter BASE_ADR = 32'h2300_0000,
Tim Edwards32d05422020-10-19 19:43:52 -040077 parameter PWRGOOD = 8'h00,
78 parameter CLK_OUT = 8'h04,
79 parameter TRAP_OUT = 8'h08,
80 parameter IRQ_SRC = 8'h0c
shalanfd13eb52020-08-21 16:48:07 +020081) (
82 input clk,
83 input resetn,
84
shalanfd13eb52020-08-21 16:48:07 +020085 input [31:0] iomem_addr,
86 input iomem_valid,
87 input [3:0] iomem_wstrb,
88 input [31:0] iomem_wdata,
89 output reg [31:0] iomem_rdata,
90 output reg iomem_ready,
91
Tim Edwards05ad4fc2020-10-19 22:12:33 -040092 input usr1_vcc_pwrgood,
93 input usr2_vcc_pwrgood,
94 input usr1_vdd_pwrgood,
95 input usr2_vdd_pwrgood,
Tim Edwards32d05422020-10-19 19:43:52 -040096 output clk1_output_dest,
97 output clk2_output_dest,
Tim Edwardsef8312e2020-09-22 17:20:06 -040098 output trap_output_dest,
Tim Edwards32d05422020-10-19 19:43:52 -040099 output irq_7_inputsrc,
100 output irq_8_inputsrc
shalanfd13eb52020-08-21 16:48:07 +0200101);
shalanfd13eb52020-08-21 16:48:07 +0200102
Tim Edwards32d05422020-10-19 19:43:52 -0400103 reg clk1_output_dest;
104 reg clk2_output_dest;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400105 reg trap_output_dest;
106 reg irq_7_inputsrc;
Tim Edwards32d05422020-10-19 19:43:52 -0400107 reg irq_8_inputsrc;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400108
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400109 wire usr1_vcc_pwrgood;
110 wire usr2_vcc_pwrgood;
111 wire usr1_vdd_pwrgood;
112 wire usr2_vdd_pwrgood;
Tim Edwards32d05422020-10-19 19:43:52 -0400113
Tim Edwards581068f2020-11-19 12:45:25 -0500114 wire pwrgood_sel;
115 wire clk_out_sel;
116 wire trap_out_sel;
117 wire irq_sel;
118
Tim Edwards32d05422020-10-19 19:43:52 -0400119 assign pwrgood_sel = (iomem_addr[7:0] == PWRGOOD);
120 assign clk_out_sel = (iomem_addr[7:0] == CLK_OUT);
shalanfd13eb52020-08-21 16:48:07 +0200121 assign trap_out_sel = (iomem_addr[7:0] == TRAP_OUT);
Tim Edwards32d05422020-10-19 19:43:52 -0400122 assign irq_sel = (iomem_addr[7:0] == IRQ_SRC);
shalanfd13eb52020-08-21 16:48:07 +0200123
shalanfd13eb52020-08-21 16:48:07 +0200124 always @(posedge clk) begin
125 if (!resetn) begin
Tim Edwards32d05422020-10-19 19:43:52 -0400126 clk1_output_dest <= 0;
127 clk2_output_dest <= 0;
shalanfd13eb52020-08-21 16:48:07 +0200128 trap_output_dest <= 0;
129 irq_7_inputsrc <= 0;
Tim Edwards32d05422020-10-19 19:43:52 -0400130 irq_8_inputsrc <= 0;
shalanfd13eb52020-08-21 16:48:07 +0200131 end else begin
132 iomem_ready <= 0;
133 if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
134 iomem_ready <= 1'b 1;
135
Tim Edwards32d05422020-10-19 19:43:52 -0400136 if (pwrgood_sel) begin
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400137 iomem_rdata <= {28'd0, usr2_vdd_pwrgood, usr1_vdd_pwrgood,
138 usr2_vcc_pwrgood, usr1_vcc_pwrgood};
Tim Edwards32d05422020-10-19 19:43:52 -0400139 // These are read-only bits; no write behavior on wstrb.
140
141 end else if (clk_out_sel) begin
142 iomem_rdata <= {30'd0, clk2_output_dest, clk1_output_dest};
143 if (iomem_wstrb[0]) begin
144 clk1_output_dest <= iomem_wdata[0];
145 clk2_output_dest <= iomem_wdata[1];
146 end
shalanfd13eb52020-08-21 16:48:07 +0200147
148 end else if (trap_out_sel) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400149 iomem_rdata <= {31'd0, trap_output_dest};
shalanfd13eb52020-08-21 16:48:07 +0200150 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400151 trap_output_dest <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200152
Tim Edwards32d05422020-10-19 19:43:52 -0400153 end else if (irq_sel) begin
154 iomem_rdata <= {30'd0, irq_8_inputsrc, irq_7_inputsrc};
155 if (iomem_wstrb[0]) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400156 irq_7_inputsrc <= iomem_wdata[0];
Tim Edwards32d05422020-10-19 19:43:52 -0400157 irq_8_inputsrc <= iomem_wdata[1];
158 end
shalanfd13eb52020-08-21 16:48:07 +0200159 end
160 end
161 end
162 end
163
Tim Edwardsef8312e2020-09-22 17:20:06 -0400164endmodule
Tim Edwards581068f2020-11-19 12:45:25 -0500165`default_nettype wire