Files
FPGA-Neural/sim/layer_sequencer.vcd
T
michele 233d6ff7fb feat: complete Phase 5 multi-layer network (RUN_NETWORK) + fix STATUS race
Wires the already-present layer_sequencer.v into the SPI stack:

- spi_engine.v: RUN_NETWORK opcode (0x23) + SET_BASE selectors for
  table_base/buf_a_base/buf_b_base; STATUS.busy/done extended to
  track the sequencer (seq_busy/seq_done) alongside neuron_memory
  directly, so done latches on the last layer only.
- spi_neuron_top.v: instantiates layer_sequencer, muxes
  neuron_memory's control inputs between it (while seq_busy) and
  spi_engine's direct-drive path (legacy single-layer mode), wires
  the sequencer's own RAM master to mem_arbiter's Port C.

Found and fixed a real race while writing the end-to-end test: STATUS's
sticky/clear-on-read done bit read its value live/combinationally
during transmission and cleared unconditionally on any STATUS read.
A done_event landing mid-transmission of a STATUS response byte could
be silently dropped -- the host would receive a stale byte while the
sticky bit was cleared regardless, hanging any host polling STATUS in
a loop. Present since Phase 4, not RUN_NETWORK-specific; only
surfaced under this test's continuous polling. Fixed by latching a
status_snapshot at opcode-accept time and gating the clear on what
was actually transmitted.

Tests: spi_engine_tb.v gains RUN_NETWORK/SET_BASE opcode tests (K/L);
new layer_sequencer_tb.v unit-tests the sequencer FSM directly
(descriptor table, ping-pong buffer addressing, byte-exact copy-out);
new spi_neuron_top_runnetwork_tb.v drives a real 2-layer network over
simulated SPI end to end (real neuron_memory + PSRAM, hand-computed
expected output) and confirms the legacy single-layer path still
works afterward. All existing testbenches still pass.
2026-09-02 19:47:36 +02:00

1465 lines
13 KiB
Plaintext

$date
Wed Sep 2 19:00:18 2026
$end
$version
Icarus Verilog
$end
$timescale
1ps
$end
$scope module tb $end
$var wire 1 ! seq_done $end
$var wire 1 " seq_busy $end
$var wire 1 # ram_wr $end
$var wire 8 $ ram_wdata [7:0] $end
$var wire 1 % ram_req $end
$var wire 22 & ram_addr [21:0] $end
$var wire 22 ' nm_x_base [21:0] $end
$var wire 22 ( nm_w_base [21:0] $end
$var wire 1 ) nm_start $end
$var wire 22 * nm_bias_addr [21:0] $end
$var parameter 32 + ADDR_WIDTH $end
$var parameter 22 , BUF_A_BASE $end
$var parameter 22 - BUF_B_BASE $end
$var real 1 . CLK_PERIOD $end
$var parameter 32 / DATA_WIDTH $end
$var parameter 22 0 L0_BIAS_ADDR $end
$var parameter 22 1 L0_W_BASE $end
$var parameter 22 2 L1_BIAS_ADDR $end
$var parameter 22 3 L1_W_BASE $end
$var parameter 32 4 N_LAYERS $end
$var parameter 32 5 N_WIDTH $end
$var parameter 1 6 RAM_IDLE $end
$var parameter 1 7 RAM_WAIT $end
$var parameter 22 8 TABLE_BASE $end
$var parameter 22 9 X_BASE $end
$var reg 22 : buf_a_base [21:0] $end
$var reg 22 ; buf_b_base [21:0] $end
$var reg 1 < clk $end
$var reg 1 = nm_busy $end
$var reg 1 > nm_done $end
$var reg 22 ? ram_addr_latched [21:0] $end
$var reg 8 @ ram_rdata [7:0] $end
$var reg 1 A ram_ready $end
$var reg 1 B ram_state $end
$var reg 8 C ram_wdata_latched [7:0] $end
$var reg 1 D ram_wr_latched $end
$var reg 1 E rst $end
$var reg 8 F run_num_layers [7:0] $end
$var reg 1 G run_start $end
$var reg 1 H seq_busy_dropped_early $end
$var reg 32 I staged_y [31:0] $end
$var reg 22 J table_base [21:0] $end
$var reg 22 K x_base [21:0] $end
$var reg 32 L y_bus [31:0] $end
$var integer 32 M errors [31:0] $end
$var integer 32 N errors_before [31:0] $end
$var integer 32 O i [31:0] $end
$var integer 32 P nm_delay [31:0] $end
$var integer 32 Q seq_done_count [31:0] $end
$scope module u_dut $end
$var wire 22 R buf_a_base [21:0] $end
$var wire 22 S buf_b_base [21:0] $end
$var wire 1 < clk $end
$var wire 1 = nm_busy $end
$var wire 1 > nm_done $end
$var wire 8 T ram_rdata [7:0] $end
$var wire 1 A ram_ready $end
$var wire 1 E rst $end
$var wire 8 U run_num_layers [7:0] $end
$var wire 1 G run_start $end
$var wire 22 V table_base [21:0] $end
$var wire 22 W x_base [21:0] $end
$var wire 32 X y_bus [31:0] $end
$var parameter 32 Y ADDR_WIDTH $end
$var parameter 32 Z DATA_WIDTH $end
$var parameter 32 [ N_LAYERS $end
$var parameter 32 \ N_WIDTH $end
$var parameter 4 ] ST_COPY_ISSUE $end
$var parameter 4 ^ ST_COPY_WAIT $end
$var parameter 4 _ ST_IDLE $end
$var parameter 4 ` ST_READ_DESC $end
$var parameter 4 a ST_READ_WAIT $end
$var parameter 4 b ST_START_LAYER $end
$var parameter 4 c ST_WAIT_LAYER $end
$var reg 24 d bias_addr_acc [23:0] $end
$var reg 3 e copy_idx [2:0] $end
$var reg 1 f cur_sel $end
$var reg 3 g desc_byte_idx [2:0] $end
$var reg 22 h desc_table_addr [21:0] $end
$var reg 8 i layer_idx [7:0] $end
$var reg 22 j nm_bias_addr [21:0] $end
$var reg 1 ) nm_start $end
$var reg 22 k nm_w_base [21:0] $end
$var reg 22 l nm_x_base [21:0] $end
$var reg 8 m num_layers_reg [7:0] $end
$var reg 22 n ram_addr [21:0] $end
$var reg 1 % ram_req $end
$var reg 8 o ram_wdata [7:0] $end
$var reg 1 # ram_wr $end
$var reg 1 " seq_busy $end
$var reg 1 ! seq_done $end
$var reg 4 p state [3:0] $end
$var reg 24 q w_base_acc [23:0] $end
$var reg 1 r write_sel $end
$upscope $end
$scope task clk_wait $end
$var integer 32 s k [31:0] $end
$var integer 32 t n [31:0] $end
$upscope $end
$scope task report $end
$var reg 512 u label [511:0] $end
$upscope $end
$scope task stage_layer_output $end
$var reg 32 v val [31:0] $end
$upscope $end
$upscope $end
$enddefinitions $end
$comment Show the parameter values. $end
$dumpall
b100 c
b11 b
b10 a
b1 `
b0 _
b110 ^
b101 ]
b100 \
b100 [
b1000 Z
b10110 Y
b10000 9
b100000000 8
17
06
b100 5
b100 4
b11000000000000 3
b100000000000000 2
b1000000000000 1
b10000000000000 0
b1000 /
r12.5 .
b1100000000 -
b1000000000 ,
b10110 +
$end
#0
$dumpvars
bx v
bx u
bx t
bx s
xr
bx q
bx p
bx o
bx n
bx m
bx l
bx k
bx j
bx i
bx h
bx g
xf
bx e
bx d
b0 X
b10000 W
b100000000 V
b0 U
bx T
b1100000000 S
b1000000000 R
bx Q
bx P
b1000000000000 O
bx N
b0 M
b0 L
b10000 K
b100000000 J
bx I
xH
0G
b0 F
1E
xD
bx C
xB
xA
bx @
bx ?
0>
0=
0<
b1100000000 ;
b1000000000 :
bx *
x)
bx (
bx '
bx &
x%
bx $
x#
x"
x!
$end
#6250
0!
0"
b0 $
b0 o
b0 &
b0 n
0#
0%
0)
b0 *
b0 j
b0 (
b0 k
b0 '
b0 l
b0 e
0r
0f
b0 d
b0 q
b0 g
b0 h
b0 m
b0 i
b0 p
b0 @
b0 T
0A
0B
0H
b0 Q
1<
#12500
0<
#18750
1<
#25000
0<
#31250
1<
#37500
0<
#43750
1<
#50000
0<
#56250
0E
1<
#62500
0<
#68750
1<
#75000
0<
#81250
1<
#87500
0<
#93750
1<
#100000
0<
#106250
1<
#112500
0<
#118750
b101001000111110001010100001011 I
b101001000111110001010100001011 v
b0 N
1<
#125000
b10 F
b10 U
1G
0<
#131250
b1 p
b100000000 h
b10 m
1"
1<
#137500
b0 s
b10 t
0G
0<
#143750
b10 p
b100000000 &
b100000000 n
1%
b1 s
1<
#150000
0<
#156250
0%
1B
b0 C
0D
b100000000 ?
b10 s
1<
#162500
0<
#168750
0B
1A
bx000000 @
bx000000 T
1<
#175000
0<
#181250
b1 p
b1 g
bx0000000000000000000000 q
0A
1<
#187500
0<
#193750
b10 p
b100000001 &
b100000001 n
1%
1<
#200000
0<
#206250
0%
1B
b100000001 ?
1<
#212500
0<
#218750
0B
1A
b10000 @
b10000 T
1<
#225000
0<
#231250
b1 p
b10 g
bx0000000001000000000000 q
0A
1<
#237500
0<
#243750
b10 p
b100000010 &
b100000010 n
1%
1<
#250000
0<
#256250
0%
1B
b100000010 ?
1<
#262500
0<
#268750
0B
1A
b0 @
b0 T
1<
#275000
0<
#281250
b1 p
b11 g
0A
1<
#287500
0<
#293750
b10 p
b100000011 &
b100000011 n
1%
1<
#300000
0<
#306250
0%
1B
b100000011 ?
1<
#312500
0<
#318750
0B
1A
bx000000 @
bx000000 T
1<
#325000
0<
#331250
b1 p
b100 g
bx0000000000000000000000 d
0A
1<
#337500
0<
#343750
b10 p
b100000100 &
b100000100 n
1%
1<
#350000
0<
#356250
0%
1B
b100000100 ?
1<
#362500
0<
#368750
0B
1A
b100000 @
b100000 T
1<
#375000
0<
#381250
b1 p
b101 g
bx0000000010000000000000 d
0A
1<
#387500
0<
#393750
b10 p
b100000101 &
b100000101 n
1%
1<
#400000
0<
#406250
0%
1B
b100000101 ?
1<
#412500
0<
#418750
0B
1A
b0 @
b0 T
1<
#425000
0<
#431250
b11 p
b0 g
0A
1<
#437500
0<
#443750
b100 p
1)
b10000 '
b10000 l
b10000000000000 *
b10000000000000 j
b1000000000000 (
b1000000000000 k
1<
#450000
0<
#456250
0)
b11 P
1=
1<
#462500
0<
#468750
b10 P
1<
#475000
0<
#481250
b1 P
1<
#487500
0<
#493750
b0 P
1<
#500000
0<
#506250
b101001000111110001010100001011 L
b101001000111110001010100001011 X
1>
0=
1<
#512500
0<
#518750
0>
b101 p
1<
#525000
0<
#531250
b110 p
b1011 $
b1011 o
b1000000000 &
b1000000000 n
1#
1%
1<
#537500
0<
#543750
1B
b1011 C
1D
b1000000000 ?
0%
1<
#550000
0<
#556250
0B
1A
1<
#562500
0<
#568750
0A
b101 p
b1 e
1<
#575000
0<
#581250
b110 p
b10101 $
b10101 o
b1000000001 &
b1000000001 n
1%
1<
#587500
0<
#593750
1B
b10101 C
b1000000001 ?
0%
1<
#600000
0<
#606250
0B
1A
1<
#612500
0<
#618750
0A
b101 p
b10 e
1<
#625000
0<
#631250
b110 p
b11111 $
b11111 o
b1000000010 &
b1000000010 n
1%
1<
#637500
0<
#643750
1B
b11111 C
b1000000010 ?
0%
1<
#650000
0<
#656250
0B
1A
1<
#662500
0<
#668750
0A
b101 p
b11 e
1<
#675000
0<
#681250
b110 p
b101001 $
b101001 o
b1000000011 &
b1000000011 n
1%
1<
#687500
0<
#693750
1B
b101001 C
b1000000011 ?
0%
1<
#700000
0<
#706250
0B
1A
1<
#712500
0<
#718750
0A
b1 p
b100000110 h
b1 i
1r
1<
#725000
0<
#731250
b10 p
b100000110 &
b100000110 n
0#
1%
1<
#737500
0<
#743750
1B
0D
b100000110 ?
0%
1<
#750000
0<
#756250
0B
1A
bx000000 @
bx000000 T
1<
#762500
0<
#768750
0A
b1 p
b1 g
1<
#775000
0<
#781250
b10 p
b100000111 &
b100000111 n
1%
1<
#787500
0<
#793750
1B
b100000111 ?
0%
1<
#800000
0<
#806250
0B
1A
b110000 @
b110000 T
1<
#812500
0<
#818750
0A
b1 p
b10 g
bx0000000011000000000000 q
1<
#825000
0<
#831250
b10 p
b100001000 &
b100001000 n
1%
1<
#837500
0<
#843750
1B
b100001000 ?
0%
1<
#850000
0<
#856250
0B
1A
b0 @
b0 T
1<
#862500
0<
#868750
0A
b1 p
b11 g
1<
#875000
0<
#881250
b10 p
b100001001 &
b100001001 n
1%
1<
#887500
0<
#893750
1B
b100001001 ?
0%
1<
#900000
0<
#906250
0B
1A
bx000000 @
bx000000 T
1<
#912500
0<
#918750
0A
b1 p
b100 g
1<
#925000
0<
#931250
b10 p
b100001010 &
b100001010 n
1%
1<
#937500
0<
#943750
1B
b100001010 ?
0%
1<
#950000
0<
#956250
0B
1A
b1000000 @
b1000000 T
1<
#962500
0<
#968750
0A
b1 p
b101 g
bx0000000100000000000000 d
1<
#975000
0<
#981250
b10 p
b100001011 &
b100001011 n
1%
1<
#987500
0<
#993750
1B
b100001011 ?
0%
1<
#1000000
0<
#1006250
0B
1A
b0 @
b0 T
1<
#1012500
0<
#1018750
0A
b11 p
b0 g
1<
#1025000
0<
#1031250
b101100001000010001011000001011 I
b101100001000010001011000001011 v
b100 p
1)
b1000000000 '
b1000000000 l
b100000000000000 *
b100000000000000 j
b11000000000000 (
b11000000000000 k
1<
#1037500
0<
#1043750
b11 P
1=
0)
1<
#1050000
0<
#1056250
b10 P
1<
#1062500
0<
#1068750
b1 P
1<
#1075000
0<
#1081250
b0 P
1<
#1087500
0<
#1093750
b101100001000010001011000001011 L
b101100001000010001011000001011 X
1>
0=
1<
#1100000
0<
#1106250
b101 p
b0 e
0>
1<
#1112500
0<
#1118750
b110 p
b1011 $
b1011 o
b1100000000 &
b1100000000 n
1#
1%
1<
#1125000
0<
#1131250
0%
1B
b1011 C
1D
b1100000000 ?
1<
#1137500
0<
#1143750
0B
1A
1<
#1150000
0<
#1156250
b101 p
b1 e
0A
1<
#1162500
0<
#1168750
b110 p
b10110 $
b10110 o
b1100000001 &
b1100000001 n
1%
1<
#1175000
0<
#1181250
0%
1B
b10110 C
b1100000001 ?
1<
#1187500
0<
#1193750
0B
1A
1<
#1200000
0<
#1206250
b101 p
b10 e
0A
1<
#1212500
0<
#1218750
b110 p
b100001 $
b100001 o
b1100000010 &
b1100000010 n
1%
1<
#1225000
0<
#1231250
0%
1B
b100001 C
b1100000010 ?
1<
#1237500
0<
#1243750
0B
1A
1<
#1250000
0<
#1256250
b101 p
b11 e
0A
1<
#1262500
0<
#1268750
b110 p
b101100 $
b101100 o
b1100000011 &
b1100000011 n
1%
1<
#1275000
0<
#1281250
0%
1B
b101100 C
b1100000011 ?
1<
#1287500
0<
#1293750
0B
1A
1<
#1300000
0<
#1306250
b0 p
1!
0"
0A
1<
#1312500
0<
#1318750
b1 Q
0!
b0 s
b100 t
1<
#1325000
0<
#1331250
b1 s
1<
#1337500
0<
#1343750
b10 s
1<
#1350000
0<
#1356250
b11 s
1<
#1362500
0<
#1368750
b100000000110000001000000001 I
b100000000110000001000000001 v
b1010100010001010101001101010100001000000100000100111010001000000011001000101101011011000110000101111001011001010111001000100000011100100111010101101110001000000010100001100100011001010111001101100011011100100110100101110000011101000110111101110010001000000010111100100000011100000110100101101110011001110010110101110000011011110110111001100111001000000010111100100000011000110110111101110000011110010010110101101111011101010111010000101001 u
b100 s
1<
#1375000
b1 F
b1 U
1G
0<
#1381250
b1 p
0r
b100000000 h
b1 m
b0 i
1"
1<
#1387500
b0 s
b10 t
0G
0<
#1393750
b10 p
b100000000 &
b100000000 n
0#
1%
b1 s
1<
#1400000
0<
#1406250
0%
1B
0D
b100000000 ?
b10 s
1<
#1412500
b11 F
b11 U
1G
0<
#1418750
0B
1A
bx000000 @
bx000000 T
1<
#1425000
0G
0<
#1431250
b1 p
b1 g
0A
1<
#1437500
0<
#1443750
b10 p
b100000001 &
b100000001 n
1%
1<
#1450000
0<
#1456250
0%
1B
b100000001 ?
1<
#1462500
0<
#1468750
0B
1A
b10000 @
b10000 T
1<
#1475000
0<
#1481250
b1 p
b10 g
bx0000000001000000000000 q
0A
1<
#1487500
0<
#1493750
b10 p
b100000010 &
b100000010 n
1%
1<
#1500000
0<
#1506250
0%
1B
b100000010 ?
1<
#1512500
0<
#1518750
0B
1A
b0 @
b0 T
1<
#1525000
0<
#1531250
b1 p
b11 g
0A
1<
#1537500
0<
#1543750
b10 p
b100000011 &
b100000011 n
1%
1<
#1550000
0<
#1556250
0%
1B
b100000011 ?
1<
#1562500
0<
#1568750
0B
1A
bx000000 @
bx000000 T
1<
#1575000
0<
#1581250
b1 p
b100 g
0A
1<
#1587500
0<
#1593750
b10 p
b100000100 &
b100000100 n
1%
1<
#1600000
0<
#1606250
0%
1B
b100000100 ?
1<
#1612500
0<
#1618750
0B
1A
b100000 @
b100000 T
1<
#1625000
0<
#1631250
b1 p
b101 g
bx0000000010000000000000 d
0A
1<
#1637500
0<
#1643750
b10 p
b100000101 &
b100000101 n
1%
1<
#1650000
0<
#1656250
0%
1B
b100000101 ?
1<
#1662500
0<
#1668750
0B
1A
b0 @
b0 T
1<
#1675000
0<
#1681250
b11 p
b0 g
0A
1<
#1687500
0<
#1693750
b100 p
1)
b10000 '
b10000 l
b10000000000000 *
b10000000000000 j
b1000000000000 (
b1000000000000 k
1<
#1700000
0<
#1706250
0)
b11 P
1=
1<
#1712500
0<
#1718750
b10 P
1<
#1725000
0<
#1731250
b1 P
1<
#1737500
0<
#1743750
b0 P
1<
#1750000
0<
#1756250
b100000000110000001000000001 L
b100000000110000001000000001 X
1>
0=
1<
#1762500
0<
#1768750
0>
b101 p
b0 e
1<
#1775000
0<
#1781250
b110 p
b1 $
b1 o
b1000000000 &
b1000000000 n
1#
1%
1<
#1787500
0<
#1793750
1B
b1 C
1D
b1000000000 ?
0%
1<
#1800000
0<
#1806250
0B
1A
1<
#1812500
0<
#1818750
0A
b101 p
b1 e
1<
#1825000
0<
#1831250
b110 p
b10 $
b10 o
b1000000001 &
b1000000001 n
1%
1<
#1837500
0<
#1843750
1B
b10 C
b1000000001 ?
0%
1<
#1850000
0<
#1856250
0B
1A
1<
#1862500
0<
#1868750
0A
b101 p
b10 e
1<
#1875000
0<
#1881250
b110 p
b11 $
b11 o
b1000000010 &
b1000000010 n
1%
1<
#1887500
0<
#1893750
1B
b11 C
b1000000010 ?
0%
1<
#1900000
0<
#1906250
0B
1A
1<
#1912500
0<
#1918750
0A
b101 p
b11 e
1<
#1925000
0<
#1931250
b110 p
b100 $
b100 o
b1000000011 &
b1000000011 n
1%
1<
#1937500
0<
#1943750
1B
b100 C
b1000000011 ?
0%
1<
#1950000
0<
#1956250
0B
1A
1<
#1962500
0<
#1968750
0A
b0 p
1!
0"
1<
#1975000
0<
#1981250
0!
b10 Q
b0 s
b100 t
1<
#1987500
0<
#1993750
b1 s
1<
#2000000
0<
#2006250
b10 s
1<
#2012500
0<
#2018750
b11 s
1<
#2025000
0<
#2031250
b10101000100010101010011010101000010000001000010001110100010000001110010011101010110111001011111011100110111010001100001011100100111010000100000011100100110010100101101011100000111010101101100011100110110010100100000011011010110100101100100001011010111001001110101011011100010000001100100011011110110010101110011001000000110111001101111011101000010000001100011011011110111001001110010011101010111000001110100001000000111001101110100011000010111010001100101 u
b100 s
1<