-
Notifications
You must be signed in to change notification settings - Fork 415
/
cv32e40p_tb_subsystem.sv
165 lines (135 loc) · 5.14 KB
/
cv32e40p_tb_subsystem.sv
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
// Copyright 2018 Robert Balas <[email protected]>
// Copyright and related rights are licensed under the Solderpad Hardware
// License, Version 0.51 (the "License"); you may not use this file except in
// compliance with the License. You may obtain a copy of the License at
// http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law
// or agreed to in writing, software, hardware and materials distributed under
// this License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
// CONDITIONS OF ANY KIND, either express or implied. See the License for the
// specific language governing permissions and limitations under the License.
// Wrapper for a RI5CY testbench, containing RI5CY, Memory and stdout peripheral
// Contributor: Robert Balas <[email protected]>
module cv32e40p_tb_subsystem #(
parameter INSTR_RDATA_WIDTH = 32,
parameter RAM_ADDR_WIDTH = 20,
parameter BOOT_ADDR = 'h180,
parameter PULP_XPULP = 0,
parameter PULP_CLUSTER = 0,
parameter FPU = 0,
parameter FPU_ADDMUL_LAT = 0,
parameter FPU_OTHERS_LAT = 0,
parameter ZFINX = 0,
parameter NUM_MHPMCOUNTERS = 1,
parameter DM_HALTADDRESS = 32'h1A110800
) (
input logic clk_i,
input logic rst_ni,
input logic fetch_enable_i,
output logic tests_passed_o,
output logic tests_failed_o,
output logic [31:0] exit_value_o,
output logic exit_valid_o
);
// signals connecting core to memory
logic instr_req;
logic instr_gnt;
logic instr_rvalid;
logic [ 31:0] instr_addr;
logic [INSTR_RDATA_WIDTH-1:0] instr_rdata;
logic data_req;
logic data_gnt;
logic data_rvalid;
logic [ 31:0] data_addr;
logic data_we;
logic [ 3:0] data_be;
logic [ 31:0] data_rdata;
logic [ 31:0] data_wdata;
logic [ 5:0] data_atop = 6'b0;
// signals to debug unit
logic debug_req_i;
// irq signals
logic irq_ack;
logic [ 4:0] irq_id_out;
logic irq_software;
logic irq_timer;
logic irq_external;
logic [ 15:0] irq_fast;
logic core_sleep_o;
assign debug_req_i = 1'b0;
// instantiate the core
cv32e40p_top #(
.PULP_XPULP (PULP_XPULP),
.PULP_CLUSTER (PULP_CLUSTER),
.FPU (FPU),
.FPU_ADDMUL_LAT (FPU_ADDMUL_LAT),
.FPU_OTHERS_LAT (FPU_OTHERS_LAT),
.ZFINX (ZFINX),
.NUM_MHPMCOUNTERS(NUM_MHPMCOUNTERS)
) top_i (
.clk_i (clk_i),
.rst_ni(rst_ni),
.pulp_clock_en_i(1'b1),
.scan_cg_en_i (1'b0),
.boot_addr_i (BOOT_ADDR),
.mtvec_addr_i (32'h0),
.dm_halt_addr_i (DM_HALTADDRESS),
.hart_id_i (32'h0),
.dm_exception_addr_i(32'h0),
.instr_addr_o (instr_addr),
.instr_req_o (instr_req),
.instr_rdata_i (instr_rdata),
.instr_gnt_i (instr_gnt),
.instr_rvalid_i(instr_rvalid),
.data_addr_o (data_addr),
.data_wdata_o (data_wdata),
.data_we_o (data_we),
.data_req_o (data_req),
.data_be_o (data_be),
.data_rdata_i (data_rdata),
.data_gnt_i (data_gnt),
.data_rvalid_i(data_rvalid),
.irq_i ({irq_fast, 4'b0, irq_external, 3'b0, irq_timer, 3'b0, irq_software, 3'b0}),
.irq_ack_o(irq_ack),
.irq_id_o (irq_id_out),
.debug_req_i (debug_req_i),
.debug_havereset_o(),
.debug_running_o (),
.debug_halted_o (),
.fetch_enable_i(fetch_enable_i),
.core_sleep_o (core_sleep_o)
);
// this handles read to RAM and memory mapped pseudo peripherals
mm_ram #(
.RAM_ADDR_WIDTH(RAM_ADDR_WIDTH),
.INSTR_RDATA_WIDTH(INSTR_RDATA_WIDTH)
) ram_i (
.clk_i (clk_i),
.rst_ni(rst_ni),
.instr_req_i (instr_req),
.instr_addr_i (instr_addr[RAM_ADDR_WIDTH-1:0]),
.instr_rdata_o (instr_rdata),
.instr_rvalid_o(instr_rvalid),
.instr_gnt_o (instr_gnt),
.data_req_i (data_req),
.data_addr_i (data_addr),
.data_we_i (data_we),
.data_be_i (data_be),
.data_wdata_i (data_wdata),
.data_rdata_o (data_rdata),
.data_rvalid_o(data_rvalid),
.data_gnt_o (data_gnt),
.data_atop_i (data_atop),
.irq_id_i (irq_id_out),
.irq_ack_i(irq_ack),
// output irq lines to Core
.irq_software_o(irq_software),
.irq_timer_o (irq_timer),
.irq_external_o(irq_external),
.irq_fast_o (irq_fast),
.pc_core_id_i(top_i.core_i.pc_id),
.tests_passed_o(tests_passed_o),
.tests_failed_o(tests_failed_o),
.exit_valid_o (exit_valid_o),
.exit_value_o (exit_value_o)
);
endmodule // cv32e40p_tb_subsystem