switchboard-hw 0.3.0__cp314-cp314-macosx_11_0_arm64.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- _switchboard.cpython-314-darwin.so +0 -0
- switchboard/__init__.py +24 -0
- switchboard/ams.py +668 -0
- switchboard/apb.py +278 -0
- switchboard/autowrap.py +1000 -0
- switchboard/axi.py +571 -0
- switchboard/axil.py +348 -0
- switchboard/bitvector.py +112 -0
- switchboard/cmdline.py +142 -0
- switchboard/cpp/Makefile +13 -0
- switchboard/cpp/bitutil.h +39 -0
- switchboard/cpp/pagemap.h +91 -0
- switchboard/cpp/pciedev.h +86 -0
- switchboard/cpp/router.cc +89 -0
- switchboard/cpp/spsc_queue.h +267 -0
- switchboard/cpp/switchboard.hpp +257 -0
- switchboard/cpp/switchboard_pcie.hpp +234 -0
- switchboard/cpp/switchboard_tlm.hpp +98 -0
- switchboard/cpp/umilib.h +144 -0
- switchboard/cpp/umilib.hpp +113 -0
- switchboard/cpp/umisb.hpp +364 -0
- switchboard/cpp/xyce.hpp +90 -0
- switchboard/deps/__init__.py +0 -0
- switchboard/deps/verilog_axi.py +23 -0
- switchboard/dpi/__init__.py +0 -0
- switchboard/dpi/switchboard_dpi.cc +119 -0
- switchboard/dpi/switchboard_dpi.py +13 -0
- switchboard/dpi/xyce_dpi.cc +43 -0
- switchboard/gpio.py +108 -0
- switchboard/icarus.py +85 -0
- switchboard/loopback.py +157 -0
- switchboard/network.py +714 -0
- switchboard/pytest_plugin.py +11 -0
- switchboard/sbdesign.py +55 -0
- switchboard/sbdut.py +744 -0
- switchboard/sbtcp.py +345 -0
- switchboard/sc/__init__.py +0 -0
- switchboard/sc/morty/__init__.py +0 -0
- switchboard/sc/morty/uniquify.py +67 -0
- switchboard/sc/sed/__init__.py +0 -0
- switchboard/sc/sed/sed_remove.py +47 -0
- switchboard/sc/standalone_netlist_flow.py +25 -0
- switchboard/switchboard.py +53 -0
- switchboard/test_util.py +46 -0
- switchboard/uart_xactor.py +66 -0
- switchboard/umi.py +793 -0
- switchboard/util.py +131 -0
- switchboard/verilator/__init__.py +0 -0
- switchboard/verilator/config.vlt +13 -0
- switchboard/verilator/testbench.cc +143 -0
- switchboard/verilator/verilator.py +13 -0
- switchboard/verilator_run.py +31 -0
- switchboard/verilog/__init__.py +0 -0
- switchboard/verilog/common/__init__.py +0 -0
- switchboard/verilog/common/common.py +26 -0
- switchboard/verilog/common/switchboard.vh +429 -0
- switchboard/verilog/common/uart_xactor.sv +247 -0
- switchboard/verilog/common/umi_gpio.v +236 -0
- switchboard/verilog/fpga/__init__.py +0 -0
- switchboard/verilog/fpga/axi_reader.sv +82 -0
- switchboard/verilog/fpga/axi_writer.sv +111 -0
- switchboard/verilog/fpga/config_registers.sv +249 -0
- switchboard/verilog/fpga/fpga.py +21 -0
- switchboard/verilog/fpga/include/sb_queue_regmap.vh +21 -0
- switchboard/verilog/fpga/include/spsc_queue.vh +7 -0
- switchboard/verilog/fpga/memory_fault.sv +40 -0
- switchboard/verilog/fpga/sb_fpga_queues.sv +416 -0
- switchboard/verilog/fpga/sb_rx_fpga.sv +303 -0
- switchboard/verilog/fpga/sb_tx_fpga.sv +294 -0
- switchboard/verilog/fpga/umi_fpga_queues.sv +146 -0
- switchboard/verilog/sim/__init__.py +0 -0
- switchboard/verilog/sim/auto_stop_sim.sv +25 -0
- switchboard/verilog/sim/perf_meas_sim.sv +97 -0
- switchboard/verilog/sim/queue_to_sb_sim.sv +176 -0
- switchboard/verilog/sim/queue_to_umi_sim.sv +66 -0
- switchboard/verilog/sim/sb_apb_m.sv +146 -0
- switchboard/verilog/sim/sb_axi_m.sv +199 -0
- switchboard/verilog/sim/sb_axil_m.sv +180 -0
- switchboard/verilog/sim/sb_axil_s.sv +180 -0
- switchboard/verilog/sim/sb_clk_gen.sv +89 -0
- switchboard/verilog/sim/sb_jtag_rbb_sim.sv +148 -0
- switchboard/verilog/sim/sb_rx_sim.sv +55 -0
- switchboard/verilog/sim/sb_to_queue_sim.sv +196 -0
- switchboard/verilog/sim/sb_tx_sim.sv +55 -0
- switchboard/verilog/sim/switchboard_sim.py +49 -0
- switchboard/verilog/sim/umi_rx_sim.sv +61 -0
- switchboard/verilog/sim/umi_to_queue_sim.sv +66 -0
- switchboard/verilog/sim/umi_tx_sim.sv +61 -0
- switchboard/verilog/sim/xyce_intf.sv +67 -0
- switchboard/vpi/switchboard_vpi.cc +431 -0
- switchboard/vpi/xyce_vpi.cc +200 -0
- switchboard/warn.py +14 -0
- switchboard/xyce.py +27 -0
- switchboard_hw-0.3.0.dist-info/METADATA +303 -0
- switchboard_hw-0.3.0.dist-info/RECORD +99 -0
- switchboard_hw-0.3.0.dist-info/WHEEL +6 -0
- switchboard_hw-0.3.0.dist-info/entry_points.txt +6 -0
- switchboard_hw-0.3.0.dist-info/licenses/LICENSE +190 -0
- switchboard_hw-0.3.0.dist-info/top_level.txt +2 -0
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// Copyright (c) 2024 Zero ASIC Corporation
|
|
2
|
+
// This code is licensed under Apache License 2.0 (see LICENSE for details)
|
|
3
|
+
|
|
4
|
+
`default_nettype none
|
|
5
|
+
|
|
6
|
+
`ifndef VERSION_MAJOR
|
|
7
|
+
`define VERSION_MAJOR 0
|
|
8
|
+
`endif
|
|
9
|
+
|
|
10
|
+
`ifndef VERSION_MINOR
|
|
11
|
+
`define VERSION_MINOR 0
|
|
12
|
+
`endif
|
|
13
|
+
|
|
14
|
+
`define USER_REG(i) (i == 0 ? USER_0_REG : USER_1_BASE + (i - 1) * PER_USER_OFFSET)
|
|
15
|
+
|
|
16
|
+
module config_registers #(
|
|
17
|
+
// can be up to 13
|
|
18
|
+
parameter NUM_USER_REGS = 0,
|
|
19
|
+
parameter NUM_QUEUES = 2
|
|
20
|
+
) (
|
|
21
|
+
input wire clk,
|
|
22
|
+
input wire nreset,
|
|
23
|
+
|
|
24
|
+
input wire [31:0] s_axil_awaddr,
|
|
25
|
+
input wire s_axil_awvalid,
|
|
26
|
+
output wire s_axil_awready,
|
|
27
|
+
input wire [31:0] s_axil_wdata,
|
|
28
|
+
input wire [3:0] s_axil_wstrb,
|
|
29
|
+
input wire s_axil_wvalid,
|
|
30
|
+
output wire s_axil_wready,
|
|
31
|
+
output wire [1:0] s_axil_bresp,
|
|
32
|
+
output wire s_axil_bvalid,
|
|
33
|
+
input wire s_axil_bready,
|
|
34
|
+
input wire [31:0] s_axil_araddr,
|
|
35
|
+
input wire s_axil_arvalid,
|
|
36
|
+
output wire s_axil_arready,
|
|
37
|
+
output wire [31:0] s_axil_rdata,
|
|
38
|
+
output wire [1:0] s_axil_rresp,
|
|
39
|
+
output wire s_axil_rvalid,
|
|
40
|
+
input wire s_axil_rready,
|
|
41
|
+
|
|
42
|
+
input wire [NUM_QUEUES-1:0] status_idle,
|
|
43
|
+
output reg [NUM_QUEUES-1:0] cfg_enable = {NUM_QUEUES{1'd0}},
|
|
44
|
+
output reg [NUM_QUEUES-1:0] cfg_reset = {NUM_QUEUES{1'd0}},
|
|
45
|
+
output reg [NUM_QUEUES*64-1:0] cfg_base_addr,
|
|
46
|
+
output reg [NUM_QUEUES*32-1:0] cfg_capacity = {NUM_QUEUES{32'd2}},
|
|
47
|
+
output reg [(NUM_USER_REGS > 0 ? NUM_USER_REGS : 1)*32-1:0] cfg_user
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
`include "sb_queue_regmap.vh"
|
|
51
|
+
|
|
52
|
+
localparam [31:0] ID_VERSION = {16'h1234, 7'd`VERSION_MAJOR, 9'd`VERSION_MINOR};
|
|
53
|
+
localparam [31:0] UNIMPLEMENTED_REG_VALUE = 32'hffff_ffff;
|
|
54
|
+
|
|
55
|
+
wire axil_awvalid_q;
|
|
56
|
+
wire [31:0] axil_awaddr_q;
|
|
57
|
+
wire axil_awready_q;
|
|
58
|
+
wire axil_wvalid_q;
|
|
59
|
+
wire [31:0] axil_wdata_q;
|
|
60
|
+
wire [3:0] axil_wstrb_q;
|
|
61
|
+
wire axil_wready_q;
|
|
62
|
+
wire axil_bvalid_q;
|
|
63
|
+
wire [1:0] axil_bresp_q;
|
|
64
|
+
wire axil_bready_q;
|
|
65
|
+
wire axil_arvalid_q;
|
|
66
|
+
wire [31:0] axil_araddr_q;
|
|
67
|
+
wire axil_arready_q;
|
|
68
|
+
wire axil_rvalid_q;
|
|
69
|
+
wire [31:0] axil_rdata_q;
|
|
70
|
+
wire [1:0] axil_rresp_q;
|
|
71
|
+
wire axil_rready_q;
|
|
72
|
+
|
|
73
|
+
axil_register axil_reg (
|
|
74
|
+
.clk(clk),
|
|
75
|
+
.rst(~nreset),
|
|
76
|
+
.s_axil_awaddr (s_axil_awaddr),
|
|
77
|
+
.s_axil_awprot (),
|
|
78
|
+
.s_axil_awvalid (s_axil_awvalid),
|
|
79
|
+
.s_axil_awready (s_axil_awready),
|
|
80
|
+
.s_axil_wdata (s_axil_wdata),
|
|
81
|
+
.s_axil_wstrb (s_axil_wstrb),
|
|
82
|
+
.s_axil_wvalid (s_axil_wvalid),
|
|
83
|
+
.s_axil_wready (s_axil_wready),
|
|
84
|
+
.s_axil_bresp (s_axil_bresp),
|
|
85
|
+
.s_axil_bvalid (s_axil_bvalid),
|
|
86
|
+
.s_axil_bready (s_axil_bready),
|
|
87
|
+
.s_axil_araddr (s_axil_araddr),
|
|
88
|
+
.s_axil_arprot (),
|
|
89
|
+
.s_axil_arvalid (s_axil_arvalid),
|
|
90
|
+
.s_axil_arready (s_axil_arready),
|
|
91
|
+
.s_axil_rdata (s_axil_rdata),
|
|
92
|
+
.s_axil_rresp (s_axil_rresp),
|
|
93
|
+
.s_axil_rvalid (s_axil_rvalid),
|
|
94
|
+
.s_axil_rready (s_axil_rready),
|
|
95
|
+
|
|
96
|
+
.m_axil_awaddr (axil_awaddr_q),
|
|
97
|
+
.m_axil_awprot (),
|
|
98
|
+
.m_axil_awvalid (axil_awvalid_q),
|
|
99
|
+
.m_axil_awready (axil_awready_q),
|
|
100
|
+
.m_axil_wdata (axil_wdata_q),
|
|
101
|
+
.m_axil_wstrb (axil_wstrb_q),
|
|
102
|
+
.m_axil_wvalid (axil_wvalid_q),
|
|
103
|
+
.m_axil_wready (axil_wready_q),
|
|
104
|
+
.m_axil_bresp (axil_bresp_q),
|
|
105
|
+
.m_axil_bvalid (axil_bvalid_q),
|
|
106
|
+
.m_axil_bready (axil_bready_q),
|
|
107
|
+
.m_axil_araddr (axil_araddr_q),
|
|
108
|
+
.m_axil_arprot (),
|
|
109
|
+
.m_axil_arvalid (axil_arvalid_q),
|
|
110
|
+
.m_axil_arready (axil_arready_q),
|
|
111
|
+
.m_axil_rdata (axil_rdata_q),
|
|
112
|
+
.m_axil_rresp (axil_rresp_q),
|
|
113
|
+
.m_axil_rvalid (axil_rvalid_q),
|
|
114
|
+
.m_axil_rready (axil_rready_q)
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
wire [31:0] reg_wr_addr;
|
|
118
|
+
wire [31:0] reg_wr_data;
|
|
119
|
+
wire [3:0] reg_wr_strb;
|
|
120
|
+
wire reg_wr_en;
|
|
121
|
+
|
|
122
|
+
wire [31:0] reg_rd_addr;
|
|
123
|
+
reg [31:0] reg_rd_data;
|
|
124
|
+
wire reg_rd_en;
|
|
125
|
+
|
|
126
|
+
axil_reg_if reg_if (
|
|
127
|
+
.clk(clk),
|
|
128
|
+
.rst(~nreset),
|
|
129
|
+
|
|
130
|
+
.s_axil_awaddr(axil_awaddr_q),
|
|
131
|
+
.s_axil_awprot(),
|
|
132
|
+
.s_axil_awvalid(axil_awvalid_q),
|
|
133
|
+
.s_axil_awready(axil_awready_q),
|
|
134
|
+
.s_axil_wdata(axil_wdata_q),
|
|
135
|
+
.s_axil_wstrb(axil_wstrb_q),
|
|
136
|
+
.s_axil_wvalid(axil_wvalid_q),
|
|
137
|
+
.s_axil_wready(axil_wready_q),
|
|
138
|
+
.s_axil_bresp(axil_bresp_q),
|
|
139
|
+
.s_axil_bvalid(axil_bvalid_q),
|
|
140
|
+
.s_axil_bready(axil_bready_q),
|
|
141
|
+
.s_axil_araddr(axil_araddr_q),
|
|
142
|
+
.s_axil_arprot(),
|
|
143
|
+
.s_axil_arvalid(axil_arvalid_q),
|
|
144
|
+
.s_axil_arready(axil_arready_q),
|
|
145
|
+
.s_axil_rdata(axil_rdata_q),
|
|
146
|
+
.s_axil_rresp(axil_rresp_q),
|
|
147
|
+
.s_axil_rvalid(axil_rvalid_q),
|
|
148
|
+
.s_axil_rready(axil_rready_q),
|
|
149
|
+
|
|
150
|
+
.reg_wr_addr(reg_wr_addr),
|
|
151
|
+
.reg_wr_data(reg_wr_data),
|
|
152
|
+
.reg_wr_strb(reg_wr_strb),
|
|
153
|
+
.reg_wr_en(reg_wr_en),
|
|
154
|
+
.reg_wr_wait(1'b0),
|
|
155
|
+
.reg_wr_ack(1'b1),
|
|
156
|
+
|
|
157
|
+
.reg_rd_addr(reg_rd_addr),
|
|
158
|
+
.reg_rd_en(reg_rd_en),
|
|
159
|
+
.reg_rd_data(reg_rd_data),
|
|
160
|
+
.reg_rd_wait(1'b0),
|
|
161
|
+
.reg_rd_ack(1'b1)
|
|
162
|
+
);
|
|
163
|
+
|
|
164
|
+
// TODO: implement wstrb
|
|
165
|
+
|
|
166
|
+
genvar i;
|
|
167
|
+
generate
|
|
168
|
+
for (i = 0; i < NUM_USER_REGS; i++) begin
|
|
169
|
+
always @(posedge clk) begin
|
|
170
|
+
if (reg_wr_en && reg_wr_addr == `USER_REG(i)) begin
|
|
171
|
+
cfg_user[i*32+:32] <= reg_wr_data;
|
|
172
|
+
end
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
|
|
176
|
+
for (i = 0; i < NUM_QUEUES; i++) begin
|
|
177
|
+
always @(posedge clk) begin
|
|
178
|
+
if (cfg_reset[i]) begin
|
|
179
|
+
cfg_base_addr[i*64+:64] <= 64'd0;
|
|
180
|
+
cfg_capacity[i*32+:32] <= 32'd2;
|
|
181
|
+
cfg_enable[i] <= 1'd0;
|
|
182
|
+
cfg_reset[i] <= 1'd0;
|
|
183
|
+
end else if (reg_wr_en) begin
|
|
184
|
+
if (reg_wr_addr == BASE_ADDR_LO_REG + i * REG_OFFSET) begin
|
|
185
|
+
cfg_base_addr[i*64+:32] <= reg_wr_data;
|
|
186
|
+
end else if (reg_wr_addr == BASE_ADDR_HI_REG + i * REG_OFFSET) begin
|
|
187
|
+
cfg_base_addr[i*64+32+:32] <= reg_wr_data;
|
|
188
|
+
end else if (reg_wr_addr == CAPACITY_REG + i * REG_OFFSET) begin
|
|
189
|
+
cfg_capacity[i*32+:32] <= reg_wr_data;
|
|
190
|
+
end else if (reg_wr_addr == ENABLE_REG + i * REG_OFFSET) begin
|
|
191
|
+
cfg_enable[i] <= reg_wr_data[0];
|
|
192
|
+
end else if (reg_wr_addr == RESET_REG + i * REG_OFFSET) begin
|
|
193
|
+
cfg_reset[i] <= reg_wr_data[0];
|
|
194
|
+
end
|
|
195
|
+
end
|
|
196
|
+
end
|
|
197
|
+
end
|
|
198
|
+
endgenerate
|
|
199
|
+
|
|
200
|
+
always @(*) begin
|
|
201
|
+
reg_rd_data = UNIMPLEMENTED_REG_VALUE;
|
|
202
|
+
if (reg_rd_en) begin
|
|
203
|
+
if (reg_rd_addr == ID_VERSION_REG) begin
|
|
204
|
+
reg_rd_data = ID_VERSION;
|
|
205
|
+
end else if (reg_rd_addr == CAPABILITY_REG) begin
|
|
206
|
+
reg_rd_data = 32'h0;
|
|
207
|
+
end else begin
|
|
208
|
+
integer i;
|
|
209
|
+
|
|
210
|
+
for (i = 0; i < NUM_USER_REGS; i = i + 1) begin
|
|
211
|
+
if (reg_rd_addr == `USER_REG(i)) begin
|
|
212
|
+
reg_rd_data = cfg_user[i*32+:32];
|
|
213
|
+
end
|
|
214
|
+
end
|
|
215
|
+
|
|
216
|
+
for (i = 0; i < NUM_QUEUES; i = i + 1) begin
|
|
217
|
+
if (reg_rd_addr == BASE_ADDR_LO_REG + i * REG_OFFSET) begin
|
|
218
|
+
reg_rd_data = cfg_base_addr[i*64+:32];
|
|
219
|
+
end else if (reg_rd_addr == BASE_ADDR_HI_REG + i * REG_OFFSET) begin
|
|
220
|
+
reg_rd_data = cfg_base_addr[i*64+32+:32];
|
|
221
|
+
end else if (reg_rd_addr == CAPACITY_REG + i * REG_OFFSET) begin
|
|
222
|
+
reg_rd_data = cfg_capacity[i*32+:32];
|
|
223
|
+
end else if (reg_rd_addr == ENABLE_REG + i * REG_OFFSET) begin
|
|
224
|
+
reg_rd_data = {31'd0, cfg_enable[i]};
|
|
225
|
+
end else if (reg_rd_addr == RESET_REG + i * REG_OFFSET) begin
|
|
226
|
+
reg_rd_data = {31'd0, cfg_reset[i]};
|
|
227
|
+
end else if (reg_rd_addr == STATUS_REG + i * REG_OFFSET) begin
|
|
228
|
+
reg_rd_data = {31'd0, status_idle[i]};
|
|
229
|
+
end
|
|
230
|
+
end
|
|
231
|
+
end
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
`ifdef DEBUG
|
|
236
|
+
ila_0 ILA_0 (
|
|
237
|
+
.clk (clk),
|
|
238
|
+
.probe0 (axil_arvalid_q),
|
|
239
|
+
.probe1 ({32'd0, axil_araddr_q}),
|
|
240
|
+
.probe2 (axil_arready_q),
|
|
241
|
+
.probe3 (axil_rvalid_q),
|
|
242
|
+
.probe4 ({32'd0, axil_rdata_q}),
|
|
243
|
+
.probe5 (axil_rready_q)
|
|
244
|
+
);
|
|
245
|
+
`endif
|
|
246
|
+
|
|
247
|
+
endmodule
|
|
248
|
+
|
|
249
|
+
`default_nettype wire
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from siliconcompiler import Design
|
|
2
|
+
|
|
3
|
+
from switchboard import sb_path
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class FPGA(Design):
|
|
7
|
+
def __init__(self):
|
|
8
|
+
super().__init__("FPGA")
|
|
9
|
+
|
|
10
|
+
files = [
|
|
11
|
+
"axi_reader.sv"
|
|
12
|
+
]
|
|
13
|
+
deps = []
|
|
14
|
+
|
|
15
|
+
self.set_dataroot('sb_verilog_fpga', sb_path() / "verilog" / "fpga")
|
|
16
|
+
|
|
17
|
+
with self.active_fileset('rtl'):
|
|
18
|
+
for item in files:
|
|
19
|
+
self.add_file(item)
|
|
20
|
+
for item in deps:
|
|
21
|
+
self.add_depfileset(item)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
// Copyright (c) 2024 Zero ASIC Corporation
|
|
2
|
+
// This code is licensed under Apache License 2.0 (see LICENSE for details)
|
|
3
|
+
|
|
4
|
+
// System regs
|
|
5
|
+
localparam [31:0] ID_VERSION_REG = 32'h0000_0000; // ro
|
|
6
|
+
localparam [31:0] CAPABILITY_REG = 32'h0000_0004; // ro
|
|
7
|
+
|
|
8
|
+
// User regs (rw)
|
|
9
|
+
localparam [31:0] USER_0_REG = 32'h0000_0008;
|
|
10
|
+
localparam [31:0] USER_1_BASE = 32'h0000_0040;
|
|
11
|
+
localparam [31:0] PER_USER_OFFSET = 32'h0000_0010;
|
|
12
|
+
|
|
13
|
+
// Per-queue regs
|
|
14
|
+
localparam [31:0] ENABLE_REG = 32'h0000_0100; // rw
|
|
15
|
+
localparam [31:0] RESET_REG = 32'h0000_0104; // rw
|
|
16
|
+
localparam [31:0] STATUS_REG = 32'h0000_0108; // ro
|
|
17
|
+
localparam [31:0] BASE_ADDR_LO_REG = 32'h0000_010c; // rw
|
|
18
|
+
localparam [31:0] BASE_ADDR_HI_REG = 32'h0000_0110; // rw
|
|
19
|
+
localparam [31:0] CAPACITY_REG = 32'h0000_0114; // rw
|
|
20
|
+
|
|
21
|
+
localparam REG_OFFSET = 32'h100;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// Copyright (c) 2024 Zero ASIC Corporation
|
|
2
|
+
// This code is licensed under Apache License 2.0 (see LICENSE for details)
|
|
3
|
+
|
|
4
|
+
localparam [63:0] HEAD_OFFSET = 64'd0;
|
|
5
|
+
localparam [63:0] TAIL_OFFSET = 64'd64;
|
|
6
|
+
localparam [63:0] PACKET_OFFSET = 64'd128;
|
|
7
|
+
localparam PACKET_SIZE = 64;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
// Copyright (c) 2024 Zero ASIC Corporation
|
|
2
|
+
// This code is licensed under Apache License 2.0 (see LICENSE for details)
|
|
3
|
+
|
|
4
|
+
`default_nettype none
|
|
5
|
+
|
|
6
|
+
module memory_fault(
|
|
7
|
+
input wire clk,
|
|
8
|
+
input wire reset,
|
|
9
|
+
|
|
10
|
+
input wire access_valid_in,
|
|
11
|
+
input wire [63:0] access_addr,
|
|
12
|
+
|
|
13
|
+
input wire [63:0] base_legal_addr,
|
|
14
|
+
input wire [63:0] legal_length,
|
|
15
|
+
|
|
16
|
+
output wire access_valid_out,
|
|
17
|
+
output reg fault = 1'b0,
|
|
18
|
+
output reg [63:0] fault_addr = 64'd0
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
wire access_oob;
|
|
22
|
+
assign access_oob = access_valid_in &&
|
|
23
|
+
((access_addr < base_legal_addr) ||
|
|
24
|
+
(access_addr >= base_legal_addr + legal_length));
|
|
25
|
+
|
|
26
|
+
assign access_valid_out = !access_oob ? access_valid_in : 1'b0;
|
|
27
|
+
|
|
28
|
+
always @(posedge clk) begin
|
|
29
|
+
if (reset) begin
|
|
30
|
+
fault <= 1'b0;
|
|
31
|
+
fault_addr <= 64'd0;
|
|
32
|
+
end else if (access_oob) begin
|
|
33
|
+
fault <= 1'b1;
|
|
34
|
+
fault_addr <= access_addr;
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
endmodule
|
|
39
|
+
|
|
40
|
+
`default_nettype wire
|