@@ -65,35 +65,68 @@ async def test_empty_indirect_fifo_read(dut):
6565@cocotb .test ()
6666async def test_full_tx_desc_write (dut ):
6767 tb = await initialize (dut )
68- for _ in range (TRANSACTION_COUNT ):
68+ QSIZE = tb .reg_map .I3C_EC .TTI .QUEUE_SIZE
69+ QDEPTH = tb .reg_map .I3C_EC .TTI .DESC_QUEUE_DEPTH
70+ QSTAT = tb .reg_map .I3C_EC .TTI .QUEUE_STATUS
71+ MAX_DEPTH = 2 ** (await tb .read_csr_field (QSIZE .base_addr , QSIZE .TX_DESC_BUFFER_SIZE ) + 1 )
72+
73+ for i in range (TRANSACTION_COUNT ):
6974 await tb .write_csr (tb .reg_map .I3C_EC .TTI .TX_DESC_QUEUE_PORT .base_addr , int2dword (random .randint (0 , 0xffffffff )), 4 )
75+ if i < MAX_DEPTH :
76+ depth = await tb .read_csr_field (QDEPTH .base_addr , QDEPTH .TX_DESC_QUEUE_DEPTH )
77+ assert i + 1 == depth , "Transaction did not increase queue depth"
78+
7079 # Bus must not stall — verify it's still responsive
7180 data = dword2int (await tb .read_csr (tb .reg_map .I3CBASE .HCI_VERSION .base_addr , 4 ))
7281 assert data == 0x120 , f"Bus stalled: HCI_VERSION read returned 0x{ data :X} after { TRANSACTION_COUNT } TX_DESC writes"
7382
83+ assert await tb .read_csr_field (QSTAT .base_addr , QSTAT .TX_DESC_QUEUE_FULL ) == 1 , "Queue is not full"
84+
7485 await reset_n (tb .clk , tb .rst_n , cycles = 5 )
7586 await tb .teardown ()
7687
7788@cocotb .test ()
7889async def test_full_tx_data_write (dut ):
7990 tb = await initialize (dut )
80- for _ in range (TRANSACTION_COUNT ):
91+ QSIZE = tb .reg_map .I3C_EC .TTI .QUEUE_SIZE
92+ QDEPTH = tb .reg_map .I3C_EC .TTI .DATA_QUEUE_DEPTH
93+ QSTAT = tb .reg_map .I3C_EC .TTI .QUEUE_STATUS
94+ MAX_DEPTH = 2 ** (await tb .read_csr_field (QSIZE .base_addr , QSIZE .TX_DATA_BUFFER_SIZE ) + 1 )
95+
96+ for i in range (TRANSACTION_COUNT ):
8197 await tb .write_csr (tb .reg_map .I3C_EC .TTI .TX_DATA_PORT .base_addr , int2dword (random .randint (0 , 0xffffffff )), 4 )
98+ if i <= MAX_DEPTH + 1 and i > 0 :
99+ depth = await tb .read_csr_field (QDEPTH .base_addr , QDEPTH .TX_DATA_QUEUE_DEPTH )
100+ assert i == depth + 1 , "Transaction did not increase queue depth"
101+
82102 # Bus must not stall — verify it's still responsive
83103 data = dword2int (await tb .read_csr (tb .reg_map .I3CBASE .HCI_VERSION .base_addr , 4 ))
84104 assert data == 0x120 , f"Bus stalled: HCI_VERSION read returned 0x{ data :X} after { TRANSACTION_COUNT } TX_DATA writes"
85105
106+ assert await tb .read_csr_field (QSTAT .base_addr , QSTAT .TX_DATA_QUEUE_FULL ) == 1 , "Queue is not full"
107+
86108 await reset_n (tb .clk , tb .rst_n , cycles = 5 )
87109 await tb .teardown ()
88110
89111@cocotb .test ()
90112async def test_full_ibi_write (dut ):
91113 tb = await initialize (dut )
92- for _ in range (TRANSACTION_COUNT ):
114+ QSIZE = tb .reg_map .I3C_EC .TTI .IBI_QUEUE_SIZE
115+ QDEPTH = tb .reg_map .I3C_EC .TTI .IBI_QUEUE_DEPTH
116+ QSTAT = tb .reg_map .I3C_EC .TTI .QUEUE_STATUS
117+ MAX_DEPTH = 2 ** (await tb .read_csr_field (QSIZE .base_addr , QSIZE .IBI_QUEUE_SIZE ) + 1 )
118+
119+ for i in range (TRANSACTION_COUNT ):
93120 await tb .write_csr (tb .reg_map .I3C_EC .TTI .IBI_PORT .base_addr , int2dword (random .randint (0 , 0xffffffff )), 4 )
121+ if i < MAX_DEPTH :
122+ depth = await tb .read_csr_field (QDEPTH .base_addr , QDEPTH .IBI_QUEUE_DEPTH )
123+ assert i + 1 == depth , "Transaction did not increase queue depth"
124+
94125 # Bus must not stall — verify it's still responsive
95126 data = dword2int (await tb .read_csr (tb .reg_map .I3CBASE .HCI_VERSION .base_addr , 4 ))
96127 assert data == 0x120 , f"Bus stalled: HCI_VERSION read returned 0x{ data :X} after { TRANSACTION_COUNT } IBI writes"
97128
129+ assert await tb .read_csr_field (QSTAT .base_addr , QSTAT .IBI_QUEUE_FULL ) == 1 , "Queue is not full"
130+
98131 await reset_n (tb .clk , tb .rst_n , cycles = 5 )
99132 await tb .teardown ()
0 commit comments