blob: 8a694aacb8415321879d81db5c28382103efec27 [file] [log] [blame]
agorararmarde5780bf2020-12-09 21:27:56 +00001// Copyright 2020 Efabless Corporation
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
agorararmardafa96ea2020-12-09 23:37:31 +020014// SPDX-License-Identifier: Apache-2.0
agorararmarde5780bf2020-12-09 21:27:56 +000015
Matt Venn08cd6eb2020-11-16 12:01:14 +010016`default_nettype none
shalanfd13eb52020-08-21 16:48:07 +020017module sysctrl_wb #(
Tim Edwards32d05422020-10-19 19:43:52 -040018 parameter BASE_ADR = 32'h2F00_0000,
19 parameter PWRGOOD = 8'h00,
20 parameter CLK_OUT = 8'h04,
21 parameter TRAP_OUT = 8'h08,
22 parameter IRQ_SRC = 8'h0c
shalanfd13eb52020-08-21 16:48:07 +020023) (
24 input wb_clk_i,
25 input wb_rst_i,
26
27 input [31:0] wb_dat_i,
28 input [31:0] wb_adr_i,
29 input [3:0] wb_sel_i,
30 input wb_cyc_i,
31 input wb_stb_i,
32 input wb_we_i,
33
34 output [31:0] wb_dat_o,
35 output wb_ack_o,
36
Tim Edwards05ad4fc2020-10-19 22:12:33 -040037 input usr1_vcc_pwrgood,
38 input usr2_vcc_pwrgood,
39 input usr1_vdd_pwrgood,
40 input usr2_vdd_pwrgood,
Tim Edwards32d05422020-10-19 19:43:52 -040041 output clk1_output_dest,
42 output clk2_output_dest,
Tim Edwardsef8312e2020-09-22 17:20:06 -040043 output trap_output_dest,
Tim Edwards32d05422020-10-19 19:43:52 -040044 output irq_7_inputsrc,
45 output irq_8_inputsrc
shalanfd13eb52020-08-21 16:48:07 +020046
47);
48
49 wire resetn;
50 wire valid;
51 wire ready;
52 wire [3:0] iomem_we;
53
54 assign resetn = ~wb_rst_i;
55 assign valid = wb_stb_i && wb_cyc_i;
56
57 assign iomem_we = wb_sel_i & {4{wb_we_i}};
58 assign wb_ack_o = ready;
59
60 sysctrl #(
61 .BASE_ADR(BASE_ADR),
Tim Edwards32d05422020-10-19 19:43:52 -040062 .PWRGOOD(PWRGOOD),
63 .CLK_OUT(CLK_OUT),
shalanfd13eb52020-08-21 16:48:07 +020064 .TRAP_OUT(TRAP_OUT),
Tim Edwards32d05422020-10-19 19:43:52 -040065 .IRQ_SRC(IRQ_SRC)
shalanfd13eb52020-08-21 16:48:07 +020066 ) sysctrl (
67 .clk(wb_clk_i),
68 .resetn(resetn),
69
shalanfd13eb52020-08-21 16:48:07 +020070 .iomem_addr(wb_adr_i),
71 .iomem_valid(valid),
72 .iomem_wstrb(iomem_we),
73 .iomem_wdata(wb_dat_i),
74 .iomem_rdata(wb_dat_o),
75 .iomem_ready(ready),
76
Tim Edwards05ad4fc2020-10-19 22:12:33 -040077 .usr1_vcc_pwrgood(usr1_vcc_pwrgood),
78 .usr2_vcc_pwrgood(usr2_vcc_pwrgood),
79 .usr1_vdd_pwrgood(usr1_vdd_pwrgood),
80 .usr2_vdd_pwrgood(usr2_vdd_pwrgood),
Tim Edwards32d05422020-10-19 19:43:52 -040081 .clk1_output_dest(clk1_output_dest),
82 .clk2_output_dest(clk2_output_dest),
shalanfd13eb52020-08-21 16:48:07 +020083 .trap_output_dest(trap_output_dest),
Tim Edwards32d05422020-10-19 19:43:52 -040084 .irq_8_inputsrc(irq_8_inputsrc),
Tim Edwards04ba17f2020-10-02 22:27:50 -040085 .irq_7_inputsrc(irq_7_inputsrc)
shalanfd13eb52020-08-21 16:48:07 +020086 );
87
88endmodule
89
90module sysctrl #(
91 parameter BASE_ADR = 32'h2300_0000,
Tim Edwards32d05422020-10-19 19:43:52 -040092 parameter PWRGOOD = 8'h00,
93 parameter CLK_OUT = 8'h04,
94 parameter TRAP_OUT = 8'h08,
95 parameter IRQ_SRC = 8'h0c
shalanfd13eb52020-08-21 16:48:07 +020096) (
97 input clk,
98 input resetn,
99
shalanfd13eb52020-08-21 16:48:07 +0200100 input [31:0] iomem_addr,
101 input iomem_valid,
102 input [3:0] iomem_wstrb,
103 input [31:0] iomem_wdata,
104 output reg [31:0] iomem_rdata,
105 output reg iomem_ready,
106
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400107 input usr1_vcc_pwrgood,
108 input usr2_vcc_pwrgood,
109 input usr1_vdd_pwrgood,
110 input usr2_vdd_pwrgood,
Tim Edwards32d05422020-10-19 19:43:52 -0400111 output clk1_output_dest,
112 output clk2_output_dest,
Tim Edwardsef8312e2020-09-22 17:20:06 -0400113 output trap_output_dest,
Tim Edwards32d05422020-10-19 19:43:52 -0400114 output irq_7_inputsrc,
115 output irq_8_inputsrc
shalanfd13eb52020-08-21 16:48:07 +0200116);
shalanfd13eb52020-08-21 16:48:07 +0200117
Tim Edwards32d05422020-10-19 19:43:52 -0400118 reg clk1_output_dest;
119 reg clk2_output_dest;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400120 reg trap_output_dest;
121 reg irq_7_inputsrc;
Tim Edwards32d05422020-10-19 19:43:52 -0400122 reg irq_8_inputsrc;
Tim Edwardsef8312e2020-09-22 17:20:06 -0400123
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400124 wire usr1_vcc_pwrgood;
125 wire usr2_vcc_pwrgood;
126 wire usr1_vdd_pwrgood;
127 wire usr2_vdd_pwrgood;
Tim Edwards32d05422020-10-19 19:43:52 -0400128
Tim Edwards581068f2020-11-19 12:45:25 -0500129 wire pwrgood_sel;
130 wire clk_out_sel;
131 wire trap_out_sel;
132 wire irq_sel;
133
Tim Edwards32d05422020-10-19 19:43:52 -0400134 assign pwrgood_sel = (iomem_addr[7:0] == PWRGOOD);
135 assign clk_out_sel = (iomem_addr[7:0] == CLK_OUT);
shalanfd13eb52020-08-21 16:48:07 +0200136 assign trap_out_sel = (iomem_addr[7:0] == TRAP_OUT);
Tim Edwards32d05422020-10-19 19:43:52 -0400137 assign irq_sel = (iomem_addr[7:0] == IRQ_SRC);
shalanfd13eb52020-08-21 16:48:07 +0200138
shalanfd13eb52020-08-21 16:48:07 +0200139 always @(posedge clk) begin
140 if (!resetn) begin
Tim Edwards32d05422020-10-19 19:43:52 -0400141 clk1_output_dest <= 0;
142 clk2_output_dest <= 0;
shalanfd13eb52020-08-21 16:48:07 +0200143 trap_output_dest <= 0;
144 irq_7_inputsrc <= 0;
Tim Edwards32d05422020-10-19 19:43:52 -0400145 irq_8_inputsrc <= 0;
shalanfd13eb52020-08-21 16:48:07 +0200146 end else begin
147 iomem_ready <= 0;
148 if (iomem_valid && !iomem_ready && iomem_addr[31:8] == BASE_ADR[31:8]) begin
149 iomem_ready <= 1'b 1;
150
Tim Edwards32d05422020-10-19 19:43:52 -0400151 if (pwrgood_sel) begin
Tim Edwards05ad4fc2020-10-19 22:12:33 -0400152 iomem_rdata <= {28'd0, usr2_vdd_pwrgood, usr1_vdd_pwrgood,
153 usr2_vcc_pwrgood, usr1_vcc_pwrgood};
Tim Edwards32d05422020-10-19 19:43:52 -0400154 // These are read-only bits; no write behavior on wstrb.
155
156 end else if (clk_out_sel) begin
157 iomem_rdata <= {30'd0, clk2_output_dest, clk1_output_dest};
158 if (iomem_wstrb[0]) begin
159 clk1_output_dest <= iomem_wdata[0];
160 clk2_output_dest <= iomem_wdata[1];
161 end
shalanfd13eb52020-08-21 16:48:07 +0200162
163 end else if (trap_out_sel) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400164 iomem_rdata <= {31'd0, trap_output_dest};
shalanfd13eb52020-08-21 16:48:07 +0200165 if (iomem_wstrb[0])
Tim Edwardsef8312e2020-09-22 17:20:06 -0400166 trap_output_dest <= iomem_wdata[0];
shalanfd13eb52020-08-21 16:48:07 +0200167
Tim Edwards32d05422020-10-19 19:43:52 -0400168 end else if (irq_sel) begin
169 iomem_rdata <= {30'd0, irq_8_inputsrc, irq_7_inputsrc};
170 if (iomem_wstrb[0]) begin
Tim Edwardsef8312e2020-09-22 17:20:06 -0400171 irq_7_inputsrc <= iomem_wdata[0];
Tim Edwards32d05422020-10-19 19:43:52 -0400172 irq_8_inputsrc <= iomem_wdata[1];
173 end
shalanfd13eb52020-08-21 16:48:07 +0200174 end
175 end
176 end
177 end
178
Tim Edwardsef8312e2020-09-22 17:20:06 -0400179endmodule
Tim Edwards581068f2020-11-19 12:45:25 -0500180`default_nettype wire