rggen 0.5.1 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (97) hide show
  1. checksums.yaml +4 -4
  2. data/c_header/LICENSE +21 -0
  3. data/{c → c_header}/rggen.h +0 -0
  4. data/lib/rggen/builtins.rb +2 -5
  5. data/lib/rggen/builtins/bit_field/type.rb +22 -7
  6. data/lib/rggen/builtins/bit_field/types/ro.erb +2 -2
  7. data/lib/rggen/builtins/bit_field/types/ro.rb +2 -2
  8. data/lib/rggen/builtins/bit_field/types/rw.erb +5 -9
  9. data/lib/rggen/builtins/bit_field/types/rw.rb +5 -5
  10. data/lib/rggen/builtins/bit_field/types/rwl_rwe.erb +3 -7
  11. data/lib/rggen/builtins/bit_field/types/rwl_rwe.rb +6 -7
  12. data/lib/rggen/builtins/bit_field/types/w0c_w1c.erb +8 -12
  13. data/lib/rggen/builtins/bit_field/types/w0c_w1c.rb +5 -2
  14. data/lib/rggen/builtins/bit_field/types/w0s_w1s.erb +8 -12
  15. data/lib/rggen/builtins/bit_field/types/w0s_w1s.rb +3 -6
  16. data/lib/rggen/builtins/register/array.rb +0 -93
  17. data/lib/rggen/builtins/register/reg_model.rb +1 -1
  18. data/lib/rggen/builtins/register/rtl_top.rb +68 -0
  19. data/lib/rggen/builtins/register/type.rb +74 -0
  20. data/lib/rggen/builtins/register/types/default.erb +10 -0
  21. data/lib/rggen/builtins/register/types/external.erb +11 -0
  22. data/lib/rggen/builtins/register/types/external.rb +11 -0
  23. data/lib/rggen/builtins/register/types/indirect.erb +13 -0
  24. data/lib/rggen/builtins/register/types/indirect.rb +43 -0
  25. data/lib/rggen/builtins/register_block/clock_reset.rb +2 -2
  26. data/lib/rggen/builtins/register_block/host_if.rb +11 -12
  27. data/lib/rggen/builtins/register_block/host_ifs/apb.erb +7 -25
  28. data/lib/rggen/builtins/register_block/host_ifs/apb.rb +4 -13
  29. data/lib/rggen/builtins/register_block/host_ifs/axi4lite.erb +6 -34
  30. data/lib/rggen/builtins/register_block/host_ifs/axi4lite.rb +8 -30
  31. data/lib/rggen/builtins/register_block/irq_controller.rb +4 -4
  32. data/lib/rggen/builtins/register_block/rtl_top.erb +7 -0
  33. data/lib/rggen/builtins/register_block/rtl_top.rb +28 -0
  34. data/lib/rggen/core_components.rb +3 -0
  35. data/lib/rggen/core_components/ral/item.rb +2 -6
  36. data/lib/rggen/core_components/rtl/component.rb +8 -8
  37. data/lib/rggen/core_components/rtl/item.rb +41 -38
  38. data/lib/rggen/core_components/verilog_utility.rb +23 -4
  39. data/lib/rggen/core_components/verilog_utility/declaration.rb +14 -4
  40. data/lib/rggen/core_components/verilog_utility/identifier.rb +19 -0
  41. data/lib/rggen/core_components/verilog_utility/interface_instantiation.rb +33 -0
  42. data/lib/rggen/core_components/verilog_utility/interface_port_declaration.rb +29 -0
  43. data/lib/rggen/core_components/verilog_utility/local_scope.rb +64 -0
  44. data/lib/rggen/core_extensions/facets.rb +1 -1
  45. data/lib/rggen/core_extensions/forwardable.rb +1 -1
  46. data/lib/rggen/version.rb +2 -2
  47. data/ral/LICENSE +21 -0
  48. data/ral/rggen_ral_macros.svh +1 -4
  49. data/ral/rggen_ral_reg.svh +35 -3
  50. data/rtl/LICENSE +21 -0
  51. data/rtl/compile.f +21 -6
  52. data/rtl/rggen_address_decoder.sv +23 -0
  53. data/rtl/rggen_apb_if.sv +41 -0
  54. data/rtl/rggen_axi4lite_if.sv +68 -0
  55. data/rtl/rggen_bit_field_if.sv +28 -0
  56. data/rtl/rggen_bit_field_ro.sv +9 -0
  57. data/rtl/rggen_bit_field_rw.sv +25 -0
  58. data/rtl/rggen_bit_field_rwl_rwe.sv +29 -0
  59. data/rtl/rggen_bit_field_w01s_w01c.sv +55 -0
  60. data/rtl/rggen_bus_if.sv +43 -0
  61. data/rtl/rggen_bus_splitter.sv +87 -0
  62. data/rtl/rggen_default_register.sv +15 -0
  63. data/rtl/rggen_external_register.sv +83 -0
  64. data/rtl/rggen_host_if_apb.sv +29 -0
  65. data/rtl/rggen_host_if_axi4lite.sv +14 -0
  66. data/rtl/rggen_indirect_register.sv +21 -0
  67. data/rtl/{register_block/rggen_irq_controller.sv → rggen_irq_controller.sv} +0 -0
  68. data/rtl/rggen_register_base.sv +57 -0
  69. data/rtl/rggen_register_if.sv +42 -0
  70. data/rtl/rggen_rtl_pkg.sv +23 -0
  71. data/sample/LICENSE +21 -0
  72. data/sample/sample_0.sv +315 -444
  73. data/sample/sample_0_ral_pkg.sv +7 -7
  74. data/sample/sample_1.sv +104 -162
  75. data/sample/sample_1_ral_pkg.sv +3 -3
  76. data/sample/sample_setup.rb +2 -2
  77. data/setup/default.rb +3 -3
  78. metadata +35 -23
  79. data/lib/rggen/builtins/register/address_decoder.erb +0 -12
  80. data/lib/rggen/builtins/register/address_decoder.rb +0 -82
  81. data/lib/rggen/builtins/register/bus_exporter.erb +0 -28
  82. data/lib/rggen/builtins/register/bus_exporter.rb +0 -52
  83. data/lib/rggen/builtins/register/read_data.rb +0 -61
  84. data/lib/rggen/builtins/register_block/response_mux.erb +0 -18
  85. data/lib/rggen/builtins/register_block/response_mux.rb +0 -47
  86. data/lib/rggen/builtins/register_block/top_module.rb +0 -20
  87. data/rtl/bit_field/rggen_bit_field_common.svh +0 -15
  88. data/rtl/bit_field/rggen_bit_field_ro.sv +0 -8
  89. data/rtl/bit_field/rggen_bit_field_rw.sv +0 -27
  90. data/rtl/bit_field/rggen_bit_field_rwl_rwe.sv +0 -49
  91. data/rtl/bit_field/rggen_bit_field_w01s_w01c.sv +0 -67
  92. data/rtl/register/rggen_address_decoder.sv +0 -37
  93. data/rtl/register/rggen_bus_exporter.sv +0 -96
  94. data/rtl/register_block/rggen_host_if_apb.sv +0 -42
  95. data/rtl/register_block/rggen_host_if_axi4lite.sv +0 -257
  96. data/rtl/register_block/rggen_host_if_common.svh +0 -9
  97. data/rtl/register_block/rggen_response_mux.sv +0 -113
@@ -1,37 +0,0 @@
1
- module rggen_address_decoder #(
2
- parameter ADDRESS_WIDTH = 16,
3
- parameter START_ADDRESS = 'h00,
4
- parameter END_ADDRESS = 'h00,
5
- parameter INDIRECT_REGISTER = 0,
6
- parameter INDIRECT_INDEX_WIDTH = 1,
7
- parameter INDIRECT_INDEX_VALUE = 'h00
8
- )(
9
- input [ADDRESS_WIDTH-1:0] i_address,
10
- input [INDIRECT_INDEX_WIDTH-1:0] i_indirect_index,
11
- output o_select
12
- );
13
- logic match_address;
14
- logic match_indirect_index;
15
-
16
- assign o_select = (match_address && match_indirect_index) ? 1'b1 : 1'b0;
17
-
18
- generate
19
- if (START_ADDRESS == END_ADDRESS) begin
20
- assign match_address = (i_address == START_ADDRESS) ? 1'b1 : 1'b0;
21
- end
22
- else begin
23
- assign match_address = (
24
- (i_address >= START_ADDRESS) && (i_address <= END_ADDRESS)
25
- ) ? 1'b1 : 1'b0;
26
- end
27
- endgenerate
28
-
29
- generate
30
- if (INDIRECT_REGISTER) begin
31
- assign match_indirect_index = (i_indirect_index == INDIRECT_INDEX_VALUE) ? 1'b1 : 1'b0;
32
- end
33
- else begin
34
- assign match_indirect_index = 1'b1;
35
- end
36
- endgenerate
37
- endmodule
@@ -1,96 +0,0 @@
1
- module rggen_bus_exporter #(
2
- parameter DATA_WIDTH = 32,
3
- parameter LOCAL_ADDRESS_WIDTH = 16,
4
- parameter EXTERNAL_ADDRESS_WIDTH = 8,
5
- parameter START_ADDRESS = 16'h0000
6
- )(
7
- input clk,
8
- input rst_n,
9
- input i_valid,
10
- input i_select,
11
- input i_write,
12
- input i_read,
13
- input [LOCAL_ADDRESS_WIDTH-1:0] i_address,
14
- input [DATA_WIDTH/8-1:0] i_strobe,
15
- input [DATA_WIDTH-1:0] i_write_data,
16
- output o_ready,
17
- output [DATA_WIDTH-1:0] o_read_data,
18
- output [1:0] o_status,
19
- output o_valid,
20
- output o_write,
21
- output o_read,
22
- output [EXTERNAL_ADDRESS_WIDTH-1:0] o_address,
23
- output [DATA_WIDTH/8-1:0] o_strobe,
24
- output [DATA_WIDTH-1:0] o_write_data,
25
- input i_ready,
26
- input [DATA_WIDTH-1:0] i_read_data,
27
- input [1:0] i_status
28
- );
29
- logic access_done;
30
- logic valid;
31
- logic write;
32
- logic read;
33
- logic [EXTERNAL_ADDRESS_WIDTH-1:0] address;
34
- logic [DATA_WIDTH/8-1:0] strobe;
35
- logic [DATA_WIDTH-1:0] write_data;
36
-
37
- always_ff @(posedge clk or negedge rst_n) begin
38
- if (!rst_n) begin
39
- access_done <= 1'b0;
40
- end
41
- else if (valid && i_ready) begin
42
- access_done <= 1'b1;
43
- end
44
- else begin
45
- access_done <= 1'b0;
46
- end
47
- end
48
-
49
- // Internal -> External
50
- assign o_valid = valid;
51
- assign o_write = write;
52
- assign o_read = read;
53
- assign o_address = address;
54
- assign o_strobe = strobe;
55
- assign o_write_data = write_data;
56
-
57
- always_ff @(posedge clk or negedge rst_n) begin
58
- if (!rst_n) begin
59
- valid <= 1'b0;
60
- write <= 1'b0;
61
- read <= 1'b0;
62
- address <= '0;
63
- strobe <= '0;
64
- write_data <= '0;
65
- end
66
- else if (valid && i_ready) begin
67
- valid <= 1'b0;
68
- write <= 1'b0;
69
- read <= 1'b0;
70
- address <= '0;
71
- strobe <= '0;
72
- write_data <= '0;
73
- end
74
- else if (i_valid && i_select && (!valid) && (!access_done)) begin
75
- valid <= 1'b1;
76
- write <= i_write;
77
- read <= i_read;
78
- address <= calc_address(i_address);
79
- strobe <= i_strobe;
80
- write_data <= i_write_data;
81
- end
82
- end
83
-
84
- function automatic logic [EXTERNAL_ADDRESS_WIDTH-1:0] calc_address(
85
- input [LOCAL_ADDRESS_WIDTH-1:0] address
86
- );
87
- logic [LOCAL_ADDRESS_WIDTH-1:0] external_address;
88
- external_address = address - START_ADDRESS;
89
- return external_address[EXTERNAL_ADDRESS_WIDTH-1:0];
90
- endfunction
91
-
92
- // External -> Internal
93
- assign o_ready = i_ready;
94
- assign o_read_data = i_read_data;
95
- assign o_status = i_status;
96
- endmodule
@@ -1,42 +0,0 @@
1
- module rggen_host_if_apb #(
2
- parameter DATA_WIDTH = 32,
3
- parameter HOST_ADDRESS_WIDTH = 16,
4
- parameter LOCAL_ADDRESS_WIDTH = 16
5
- )(
6
- input clk,
7
- input rst_n,
8
- input [HOST_ADDRESS_WIDTH-1:0] i_paddr,
9
- input [2:0] i_pprot,
10
- input i_psel,
11
- input i_penable,
12
- input i_pwrite,
13
- input [DATA_WIDTH-1:0] i_pwdata,
14
- input [DATA_WIDTH/8-1:0] i_pstrb,
15
- output o_pready,
16
- output [DATA_WIDTH-1:0] o_prdata,
17
- output o_pslverr,
18
- output o_command_valid,
19
- output o_write,
20
- output o_read,
21
- output [LOCAL_ADDRESS_WIDTH-1:0] o_address,
22
- output [DATA_WIDTH/8-1:0] o_strobe,
23
- output [DATA_WIDTH-1:0] o_write_data,
24
- output [DATA_WIDTH-1:0] o_write_mask,
25
- input i_response_ready,
26
- input [DATA_WIDTH-1:0] i_read_data,
27
- input [1:0] i_status
28
- );
29
- `include "rggen_host_if_common.svh"
30
-
31
- assign o_pready = i_response_ready;
32
- assign o_prdata = i_read_data;
33
- assign o_pslverr = i_status[0];
34
-
35
- assign o_command_valid = i_psel;
36
- assign o_write = i_pwrite;
37
- assign o_read = ~i_pwrite;
38
- assign o_address = i_paddr[LOCAL_ADDRESS_WIDTH-1:0];
39
- assign o_strobe = i_pstrb;
40
- assign o_write_data = i_pwdata;
41
- assign o_write_mask = get_write_mask(i_pstrb);
42
- endmodule
@@ -1,257 +0,0 @@
1
- module rggen_host_if_axi4lite #(
2
- parameter DATA_WIDTH = 32,
3
- parameter HOST_ADDRESS_WIDTH = 16,
4
- parameter LOCAL_ADDRESS_WIDTH = 16,
5
- parameter WRITE_PRIORITY = 1
6
- )(
7
- input clk,
8
- input rst_n,
9
- input i_awvalid,
10
- output o_awready,
11
- input [HOST_ADDRESS_WIDTH-1:0] i_awaddr,
12
- input [2:0] i_awprot,
13
- input i_wvalid,
14
- output o_wready,
15
- input [DATA_WIDTH-1:0] i_wdata,
16
- input [DATA_WIDTH/8-1:0] i_wstrb,
17
- output o_bvalid,
18
- input i_bready,
19
- output [1:0] o_bresp,
20
- input i_arvalid,
21
- output o_arready,
22
- input [HOST_ADDRESS_WIDTH-1:0] i_araddr,
23
- input [2:0] i_arprot,
24
- output o_rvalid,
25
- input i_rready,
26
- output [DATA_WIDTH-1:0] o_rdata,
27
- output [1:0] o_rresp,
28
- output o_command_valid,
29
- output o_write,
30
- output o_read,
31
- output [LOCAL_ADDRESS_WIDTH-1:0] o_address,
32
- output [DATA_WIDTH/8-1:0] o_strobe,
33
- output [DATA_WIDTH-1:0] o_write_data,
34
- output [DATA_WIDTH-1:0] o_write_mask,
35
- input i_response_ready,
36
- input [DATA_WIDTH-1:0] i_read_data,
37
- input [1:0] i_status
38
- );
39
- `include "rggen_host_if_common.svh"
40
-
41
- typedef enum logic [5:0] {
42
- IDLE = 6'b000001,
43
- WAIT_WDATA = 6'b000010,
44
- WRITE_IN_PROGRESS = 6'b000100,
45
- WAIT_BRESP_READY = 6'b001000,
46
- READ_IN_PROGRESS = 6'b010000,
47
- WAIT_RDATA_READY = 6'b100000
48
- } e_state;
49
-
50
- typedef enum logic [1:0] {
51
- OKAY = 2'b00,
52
- EXOKAY = 2'b01,
53
- SLVERR = 2'b10,
54
- DECERR = 2'b11
55
- } e_resp;
56
-
57
- function e_resp get_resp(logic [1:0] status);
58
- case (1'b1)
59
- status[0]: return SLVERR;
60
- status[1]: return EXOKAY;
61
- default: return OKAY;
62
- endcase
63
- endfunction
64
-
65
- e_state state;
66
- logic awready;
67
- logic wready;
68
- logic bvalid;
69
- e_resp bresp;
70
- logic arready;
71
- logic rvalid;
72
- logic [DATA_WIDTH-1:0] rdata;
73
- e_resp rresp;
74
- logic awack;
75
- logic wack;
76
- logic back;
77
- logic arack;
78
- logic rack;
79
- logic command_valid;
80
- logic local_done;
81
- logic [LOCAL_ADDRESS_WIDTH-1:0] address;
82
- logic [DATA_WIDTH/8-1:0] strobe;
83
- logic [DATA_WIDTH-1:0] write_data;
84
- logic [DATA_WIDTH-1:0] write_mask;
85
-
86
- //--------------------------------------------------------------
87
- // State machine
88
- //--------------------------------------------------------------
89
- always_ff @(posedge clk or negedge rst_n) begin
90
- if (!rst_n) begin
91
- state <= IDLE;
92
- end
93
- else begin
94
- unique case (state)
95
- IDLE: begin
96
- if (awack && wack) begin
97
- state <= WRITE_IN_PROGRESS;
98
- end
99
- else if (awack) begin
100
- state <= WAIT_WDATA;
101
- end
102
- else if (arack) begin
103
- state <= READ_IN_PROGRESS;
104
- end
105
- end
106
- WAIT_WDATA: begin
107
- if (wack) begin
108
- state <= WRITE_IN_PROGRESS;
109
- end
110
- end
111
- WRITE_IN_PROGRESS: begin
112
- if (local_done) begin
113
- state <= WAIT_BRESP_READY;
114
- end
115
- end
116
- WAIT_BRESP_READY: begin
117
- if (back) begin
118
- state <= IDLE;
119
- end
120
- end
121
- READ_IN_PROGRESS: begin
122
- if (local_done) begin
123
- state <= WAIT_RDATA_READY;
124
- end
125
- end
126
- WAIT_RDATA_READY: begin
127
- if (rack) begin
128
- state <= IDLE;
129
- end
130
- end
131
- default: begin
132
- state <= IDLE;
133
- end
134
- endcase
135
- end
136
- end
137
-
138
- //--------------------------------------------------------------
139
- // AXI4-Lite
140
- //--------------------------------------------------------------
141
- assign o_awready = awready;
142
- assign o_wready = wready;
143
- assign o_bvalid = bvalid;
144
- assign o_bresp = bresp;
145
- assign o_arready = arready;
146
- assign o_rvalid = rvalid;
147
- assign o_rdata = rdata;
148
- assign o_rresp = rresp;
149
-
150
- assign awack = i_awvalid & awready;
151
- assign wack = i_wvalid & wready;
152
- assign back = bvalid & i_bready;
153
- assign arack = i_arvalid & arready;
154
- assign rack = rvalid & i_rready;
155
-
156
- generate
157
- if (WRITE_PRIORITY) begin
158
- assign awready = state[0];
159
- assign wready = (state[0] || state[1]) ? 1'b1 : 1'b0;
160
- assign bvalid = state[3];
161
- assign arready = (state[0] && (!i_awvalid)) ? 1'b1 : 1'b0;
162
- assign rvalid = state[5];
163
- end
164
- else begin
165
- assign awready = (state[0] && (!i_arvalid)) ? 1'b1 : 1'b0;
166
- assign wready = ((state[0] && (!i_arvalid)) || state[1]) ? 1'b1 : 1'b0;
167
- assign bvalid = state[3];
168
- assign arready = state[0];
169
- assign rvalid = state[5];
170
- end
171
- endgenerate
172
-
173
- always_ff @(posedge clk or negedge rst_n) begin
174
- if (!rst_n) begin
175
- bresp <= OKAY;
176
- end
177
- else if (state[2] && local_done) begin
178
- bresp <= get_resp(i_status);
179
- end
180
- else if (back) begin
181
- bresp <= OKAY;
182
- end
183
- end
184
-
185
- always_ff @(posedge clk or negedge rst_n) begin
186
- if (!rst_n) begin
187
- rdata <= '0;
188
- rresp <= OKAY;
189
- end
190
- else if (state[4] && local_done) begin
191
- rdata <= i_read_data;
192
- rresp <= get_resp(i_status);
193
- end
194
- else if (rack) begin
195
- rdata <= '0;
196
- rresp <= OKAY;
197
- end
198
- end
199
-
200
- //--------------------------------------------------------------
201
- // Local bus
202
- //--------------------------------------------------------------
203
- assign o_command_valid = command_valid;
204
- assign o_write = state[2];
205
- assign o_read = state[4];
206
- assign o_address = address;
207
- assign o_strobe = strobe;
208
- assign o_write_data = write_data;
209
- assign o_write_mask = write_mask;
210
-
211
- assign local_done = command_valid & i_response_ready;
212
-
213
- always_ff @(posedge clk or negedge rst_n) begin
214
- if (!rst_n) begin
215
- command_valid <= 1'b0;
216
- end
217
- else if (wack || arack) begin
218
- command_valid <= 1'b1;
219
- end
220
- else if (local_done) begin
221
- command_valid <= 1'b0;
222
- end
223
- end
224
-
225
- always_ff @(posedge clk or negedge rst_n) begin
226
- if (!rst_n) begin
227
- address <= '0;
228
- end
229
- else if (awack) begin
230
- address <= i_awaddr[LOCAL_ADDRESS_WIDTH-1:0];
231
- end
232
- else if (arack) begin
233
- address <= i_araddr[LOCAL_ADDRESS_WIDTH-1:0];
234
- end
235
- else if (local_done) begin
236
- address <= '0;
237
- end
238
- end
239
-
240
- always_ff @(posedge clk or negedge rst_n) begin
241
- if (!rst_n) begin
242
- strobe <= '0;
243
- write_data <= '0;
244
- write_mask <= '0;
245
- end
246
- else if (wack) begin
247
- strobe <= i_wstrb;
248
- write_data <= i_wdata;
249
- write_mask <= get_write_mask(i_wstrb);
250
- end
251
- else if (local_done) begin
252
- strobe <= '0;
253
- write_data <= '0;
254
- write_mask <= '0;
255
- end
256
- end
257
- endmodule
@@ -1,9 +0,0 @@
1
- function automatic logic [DATA_WIDTH-1:0] get_write_mask(
2
- input [DATA_WIDTH/8-1:0] strobe
3
- );
4
- logic [DATA_WIDTH-1:0] write_mask;
5
- for (int i = 0;i < $size(strobe);i++) begin
6
- write_mask[i*8+:8] = {8{strobe[i]}};
7
- end
8
- return write_mask;
9
- endfunction
@@ -1,113 +0,0 @@
1
- module rggen_response_mux #(
2
- parameter DATA_WIDTH = 32,
3
- parameter TOTAL_REGISTERS = 1,
4
- parameter TOTAL_EXTERNAL_REGISTERS = 0,
5
- parameter EXTERNAL_REGISTERS = TOTAL_EXTERNAL_REGISTERS
6
- + ((TOTAL_EXTERNAL_REGISTERS == 0) ? 1 : 0)
7
- )(
8
- input clk,
9
- input rst_n,
10
- input i_command_valid,
11
- input i_read,
12
- output o_response_ready,
13
- output [DATA_WIDTH-1:0] o_read_data,
14
- output [1:0] o_status,
15
- input [TOTAL_REGISTERS-1:0] i_register_select,
16
- input [DATA_WIDTH-1:0] i_register_read_data[TOTAL_REGISTERS],
17
- input [EXTERNAL_REGISTERS-1:0] i_external_register_select,
18
- input [EXTERNAL_REGISTERS-1:0] i_external_register_ready,
19
- input [1:0] i_external_register_status[EXTERNAL_REGISTERS]
20
- );
21
- // Response ready
22
- logic internal_ready;
23
- logic external_ready;
24
- logic response_valid;
25
- logic response_ready;
26
-
27
- assign internal_ready = (TOTAL_EXTERNAL_REGISTERS > 0) ? ~|i_external_register_select : 1'b1;
28
- assign external_ready = (TOTAL_EXTERNAL_REGISTERS > 0) ? |i_external_register_ready : 1'b0;
29
- assign response_valid = i_command_valid & (internal_ready | external_ready) & (~response_ready);
30
-
31
- assign o_response_ready = response_ready;
32
- always_ff @(posedge clk or negedge rst_n) begin
33
- if (!rst_n) begin
34
- response_ready <= 1'b0;
35
- end
36
- else if (response_valid) begin
37
- response_ready <= 1'b1;
38
- end
39
- else begin
40
- response_ready <= 1'b0;
41
- end
42
- end
43
-
44
- // Status
45
- logic [1:0] status;
46
-
47
- assign o_status = status;
48
- always_ff @(posedge clk or negedge rst_n) begin
49
- if (!rst_n) begin
50
- status <= 2'b00;
51
- end
52
- else if (response_valid) begin
53
- status <= get_internal_response(i_register_select)
54
- | get_external_response(i_external_register_select, i_external_register_status);
55
- end
56
- else begin
57
- status <= 2'b00;
58
- end
59
- end
60
-
61
- function automatic logic [1:0] get_internal_response(
62
- input [TOTAL_REGISTERS-1:0] register_select
63
- );
64
- logic slave_error;
65
- logic exokay;
66
- slave_error = ~|register_select;
67
- exokay = 1'b0;
68
- return {exokay, slave_error};
69
- endfunction
70
-
71
- function automatic logic [1:0] get_external_response(
72
- input [EXTERNAL_REGISTERS-1:0] external_register_select,
73
- input [1:0] external_register_status[EXTERNAL_REGISTERS]
74
- );
75
- if (TOTAL_EXTERNAL_REGISTERS > 0) begin
76
- logic [1:0] masked_status[TOTAL_EXTERNAL_REGISTERS];
77
- for (int i = 0;i < TOTAL_EXTERNAL_REGISTERS;i++) begin
78
- masked_status[i] = {2{external_register_select[i]}} & external_register_status[i];
79
- end
80
- return masked_status.or();
81
- end
82
- else begin
83
- return 2'b00;
84
- end
85
- endfunction
86
-
87
- // Read data
88
- logic [DATA_WIDTH-1:0] read_data;
89
-
90
- assign o_read_data = read_data;
91
- always_ff @(posedge clk or negedge rst_n) begin
92
- if (!rst_n) begin
93
- read_data <= '0;
94
- end
95
- else if (response_valid && i_read) begin
96
- read_data <= get_read_data(i_register_select, i_register_read_data);
97
- end
98
- else begin
99
- read_data <= '0;
100
- end
101
- end
102
-
103
- function automatic logic [DATA_WIDTH-1:0] get_read_data(
104
- input logic [TOTAL_REGISTERS-1:0] select,
105
- input logic [DATA_WIDTH-1:0] read_data[TOTAL_REGISTERS]
106
- );
107
- logic [DATA_WIDTH-1:0] masked_read_data[TOTAL_REGISTERS];
108
- for (int i = 0;i < TOTAL_REGISTERS;i++) begin
109
- masked_read_data[i] = {DATA_WIDTH{select[i]}} & read_data[i];
110
- end
111
- return masked_read_data.or();
112
- endfunction
113
- endmodule