rggen 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/c_header/LICENSE +21 -0
- data/{c → c_header}/rggen.h +0 -0
- data/lib/rggen/builtins.rb +2 -5
- data/lib/rggen/builtins/bit_field/type.rb +22 -7
- data/lib/rggen/builtins/bit_field/types/ro.erb +2 -2
- data/lib/rggen/builtins/bit_field/types/ro.rb +2 -2
- data/lib/rggen/builtins/bit_field/types/rw.erb +5 -9
- data/lib/rggen/builtins/bit_field/types/rw.rb +5 -5
- data/lib/rggen/builtins/bit_field/types/rwl_rwe.erb +3 -7
- data/lib/rggen/builtins/bit_field/types/rwl_rwe.rb +6 -7
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.erb +8 -12
- data/lib/rggen/builtins/bit_field/types/w0c_w1c.rb +5 -2
- data/lib/rggen/builtins/bit_field/types/w0s_w1s.erb +8 -12
- data/lib/rggen/builtins/bit_field/types/w0s_w1s.rb +3 -6
- data/lib/rggen/builtins/register/array.rb +0 -93
- data/lib/rggen/builtins/register/reg_model.rb +1 -1
- data/lib/rggen/builtins/register/rtl_top.rb +68 -0
- data/lib/rggen/builtins/register/type.rb +74 -0
- data/lib/rggen/builtins/register/types/default.erb +10 -0
- data/lib/rggen/builtins/register/types/external.erb +11 -0
- data/lib/rggen/builtins/register/types/external.rb +11 -0
- data/lib/rggen/builtins/register/types/indirect.erb +13 -0
- data/lib/rggen/builtins/register/types/indirect.rb +43 -0
- data/lib/rggen/builtins/register_block/clock_reset.rb +2 -2
- data/lib/rggen/builtins/register_block/host_if.rb +11 -12
- data/lib/rggen/builtins/register_block/host_ifs/apb.erb +7 -25
- data/lib/rggen/builtins/register_block/host_ifs/apb.rb +4 -13
- data/lib/rggen/builtins/register_block/host_ifs/axi4lite.erb +6 -34
- data/lib/rggen/builtins/register_block/host_ifs/axi4lite.rb +8 -30
- data/lib/rggen/builtins/register_block/irq_controller.rb +4 -4
- data/lib/rggen/builtins/register_block/rtl_top.erb +7 -0
- data/lib/rggen/builtins/register_block/rtl_top.rb +28 -0
- data/lib/rggen/core_components.rb +3 -0
- data/lib/rggen/core_components/ral/item.rb +2 -6
- data/lib/rggen/core_components/rtl/component.rb +8 -8
- data/lib/rggen/core_components/rtl/item.rb +41 -38
- data/lib/rggen/core_components/verilog_utility.rb +23 -4
- data/lib/rggen/core_components/verilog_utility/declaration.rb +14 -4
- data/lib/rggen/core_components/verilog_utility/identifier.rb +19 -0
- data/lib/rggen/core_components/verilog_utility/interface_instantiation.rb +33 -0
- data/lib/rggen/core_components/verilog_utility/interface_port_declaration.rb +29 -0
- data/lib/rggen/core_components/verilog_utility/local_scope.rb +64 -0
- data/lib/rggen/core_extensions/facets.rb +1 -1
- data/lib/rggen/core_extensions/forwardable.rb +1 -1
- data/lib/rggen/version.rb +2 -2
- data/ral/LICENSE +21 -0
- data/ral/rggen_ral_macros.svh +1 -4
- data/ral/rggen_ral_reg.svh +35 -3
- data/rtl/LICENSE +21 -0
- data/rtl/compile.f +21 -6
- data/rtl/rggen_address_decoder.sv +23 -0
- data/rtl/rggen_apb_if.sv +41 -0
- data/rtl/rggen_axi4lite_if.sv +68 -0
- data/rtl/rggen_bit_field_if.sv +28 -0
- data/rtl/rggen_bit_field_ro.sv +9 -0
- data/rtl/rggen_bit_field_rw.sv +25 -0
- data/rtl/rggen_bit_field_rwl_rwe.sv +29 -0
- data/rtl/rggen_bit_field_w01s_w01c.sv +55 -0
- data/rtl/rggen_bus_if.sv +43 -0
- data/rtl/rggen_bus_splitter.sv +87 -0
- data/rtl/rggen_default_register.sv +15 -0
- data/rtl/rggen_external_register.sv +83 -0
- data/rtl/rggen_host_if_apb.sv +29 -0
- data/rtl/rggen_host_if_axi4lite.sv +14 -0
- data/rtl/rggen_indirect_register.sv +21 -0
- data/rtl/{register_block/rggen_irq_controller.sv → rggen_irq_controller.sv} +0 -0
- data/rtl/rggen_register_base.sv +57 -0
- data/rtl/rggen_register_if.sv +42 -0
- data/rtl/rggen_rtl_pkg.sv +23 -0
- data/sample/LICENSE +21 -0
- data/sample/sample_0.sv +315 -444
- data/sample/sample_0_ral_pkg.sv +7 -7
- data/sample/sample_1.sv +104 -162
- data/sample/sample_1_ral_pkg.sv +3 -3
- data/sample/sample_setup.rb +2 -2
- data/setup/default.rb +3 -3
- metadata +35 -23
- data/lib/rggen/builtins/register/address_decoder.erb +0 -12
- data/lib/rggen/builtins/register/address_decoder.rb +0 -82
- data/lib/rggen/builtins/register/bus_exporter.erb +0 -28
- data/lib/rggen/builtins/register/bus_exporter.rb +0 -52
- data/lib/rggen/builtins/register/read_data.rb +0 -61
- data/lib/rggen/builtins/register_block/response_mux.erb +0 -18
- data/lib/rggen/builtins/register_block/response_mux.rb +0 -47
- data/lib/rggen/builtins/register_block/top_module.rb +0 -20
- data/rtl/bit_field/rggen_bit_field_common.svh +0 -15
- data/rtl/bit_field/rggen_bit_field_ro.sv +0 -8
- data/rtl/bit_field/rggen_bit_field_rw.sv +0 -27
- data/rtl/bit_field/rggen_bit_field_rwl_rwe.sv +0 -49
- data/rtl/bit_field/rggen_bit_field_w01s_w01c.sv +0 -67
- data/rtl/register/rggen_address_decoder.sv +0 -37
- data/rtl/register/rggen_bus_exporter.sv +0 -96
- data/rtl/register_block/rggen_host_if_apb.sv +0 -42
- data/rtl/register_block/rggen_host_if_axi4lite.sv +0 -257
- data/rtl/register_block/rggen_host_if_common.svh +0 -9
- 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,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
|