switchboard-hw 0.3.0__cp314-cp314-macosx_10_15_x86_64.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.
Files changed (99) hide show
  1. _switchboard.cpython-314-darwin.so +0 -0
  2. switchboard/__init__.py +24 -0
  3. switchboard/ams.py +668 -0
  4. switchboard/apb.py +278 -0
  5. switchboard/autowrap.py +1000 -0
  6. switchboard/axi.py +571 -0
  7. switchboard/axil.py +348 -0
  8. switchboard/bitvector.py +112 -0
  9. switchboard/cmdline.py +142 -0
  10. switchboard/cpp/Makefile +13 -0
  11. switchboard/cpp/bitutil.h +39 -0
  12. switchboard/cpp/pagemap.h +91 -0
  13. switchboard/cpp/pciedev.h +86 -0
  14. switchboard/cpp/router.cc +89 -0
  15. switchboard/cpp/spsc_queue.h +267 -0
  16. switchboard/cpp/switchboard.hpp +257 -0
  17. switchboard/cpp/switchboard_pcie.hpp +234 -0
  18. switchboard/cpp/switchboard_tlm.hpp +98 -0
  19. switchboard/cpp/umilib.h +144 -0
  20. switchboard/cpp/umilib.hpp +113 -0
  21. switchboard/cpp/umisb.hpp +364 -0
  22. switchboard/cpp/xyce.hpp +90 -0
  23. switchboard/deps/__init__.py +0 -0
  24. switchboard/deps/verilog_axi.py +23 -0
  25. switchboard/dpi/__init__.py +0 -0
  26. switchboard/dpi/switchboard_dpi.cc +119 -0
  27. switchboard/dpi/switchboard_dpi.py +13 -0
  28. switchboard/dpi/xyce_dpi.cc +43 -0
  29. switchboard/gpio.py +108 -0
  30. switchboard/icarus.py +85 -0
  31. switchboard/loopback.py +157 -0
  32. switchboard/network.py +714 -0
  33. switchboard/pytest_plugin.py +11 -0
  34. switchboard/sbdesign.py +55 -0
  35. switchboard/sbdut.py +744 -0
  36. switchboard/sbtcp.py +345 -0
  37. switchboard/sc/__init__.py +0 -0
  38. switchboard/sc/morty/__init__.py +0 -0
  39. switchboard/sc/morty/uniquify.py +67 -0
  40. switchboard/sc/sed/__init__.py +0 -0
  41. switchboard/sc/sed/sed_remove.py +47 -0
  42. switchboard/sc/standalone_netlist_flow.py +25 -0
  43. switchboard/switchboard.py +53 -0
  44. switchboard/test_util.py +46 -0
  45. switchboard/uart_xactor.py +66 -0
  46. switchboard/umi.py +793 -0
  47. switchboard/util.py +131 -0
  48. switchboard/verilator/__init__.py +0 -0
  49. switchboard/verilator/config.vlt +13 -0
  50. switchboard/verilator/testbench.cc +143 -0
  51. switchboard/verilator/verilator.py +13 -0
  52. switchboard/verilator_run.py +31 -0
  53. switchboard/verilog/__init__.py +0 -0
  54. switchboard/verilog/common/__init__.py +0 -0
  55. switchboard/verilog/common/common.py +26 -0
  56. switchboard/verilog/common/switchboard.vh +429 -0
  57. switchboard/verilog/common/uart_xactor.sv +247 -0
  58. switchboard/verilog/common/umi_gpio.v +236 -0
  59. switchboard/verilog/fpga/__init__.py +0 -0
  60. switchboard/verilog/fpga/axi_reader.sv +82 -0
  61. switchboard/verilog/fpga/axi_writer.sv +111 -0
  62. switchboard/verilog/fpga/config_registers.sv +249 -0
  63. switchboard/verilog/fpga/fpga.py +21 -0
  64. switchboard/verilog/fpga/include/sb_queue_regmap.vh +21 -0
  65. switchboard/verilog/fpga/include/spsc_queue.vh +7 -0
  66. switchboard/verilog/fpga/memory_fault.sv +40 -0
  67. switchboard/verilog/fpga/sb_fpga_queues.sv +416 -0
  68. switchboard/verilog/fpga/sb_rx_fpga.sv +303 -0
  69. switchboard/verilog/fpga/sb_tx_fpga.sv +294 -0
  70. switchboard/verilog/fpga/umi_fpga_queues.sv +146 -0
  71. switchboard/verilog/sim/__init__.py +0 -0
  72. switchboard/verilog/sim/auto_stop_sim.sv +25 -0
  73. switchboard/verilog/sim/perf_meas_sim.sv +97 -0
  74. switchboard/verilog/sim/queue_to_sb_sim.sv +176 -0
  75. switchboard/verilog/sim/queue_to_umi_sim.sv +66 -0
  76. switchboard/verilog/sim/sb_apb_m.sv +146 -0
  77. switchboard/verilog/sim/sb_axi_m.sv +199 -0
  78. switchboard/verilog/sim/sb_axil_m.sv +180 -0
  79. switchboard/verilog/sim/sb_axil_s.sv +180 -0
  80. switchboard/verilog/sim/sb_clk_gen.sv +89 -0
  81. switchboard/verilog/sim/sb_jtag_rbb_sim.sv +148 -0
  82. switchboard/verilog/sim/sb_rx_sim.sv +55 -0
  83. switchboard/verilog/sim/sb_to_queue_sim.sv +196 -0
  84. switchboard/verilog/sim/sb_tx_sim.sv +55 -0
  85. switchboard/verilog/sim/switchboard_sim.py +49 -0
  86. switchboard/verilog/sim/umi_rx_sim.sv +61 -0
  87. switchboard/verilog/sim/umi_to_queue_sim.sv +66 -0
  88. switchboard/verilog/sim/umi_tx_sim.sv +61 -0
  89. switchboard/verilog/sim/xyce_intf.sv +67 -0
  90. switchboard/vpi/switchboard_vpi.cc +431 -0
  91. switchboard/vpi/xyce_vpi.cc +200 -0
  92. switchboard/warn.py +14 -0
  93. switchboard/xyce.py +27 -0
  94. switchboard_hw-0.3.0.dist-info/METADATA +303 -0
  95. switchboard_hw-0.3.0.dist-info/RECORD +99 -0
  96. switchboard_hw-0.3.0.dist-info/WHEEL +6 -0
  97. switchboard_hw-0.3.0.dist-info/entry_points.txt +6 -0
  98. switchboard_hw-0.3.0.dist-info/licenses/LICENSE +190 -0
  99. 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