Skip to content

Commit 840b912

Browse files
committed
Add read data valid bit
1 parent 3da782e commit 840b912

File tree

2 files changed

+15
-13
lines changed

2 files changed

+15
-13
lines changed

rtl/i2c_master_wbs_16.v

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -140,13 +140,14 @@ Data register:
140140
141141
| Addr | Name | Bit 15 | Bit 14 | Bit 13 | Bit 12 | Bit 11 | Bit 10 | Bit 9 | Bit 8 |
142142
|-------|---------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
143-
| 0x04 | Data | - | - | - | - | - | - | - | data_last |
143+
| 0x04 | Data | - | - | - | - | - | - | data_last | data_valid|
144144
145145
| Addr | Name | Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0 |
146146
|-------|---------------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|-----------|
147147
| 0x04 | Data | data[7:0] |
148148
149149
data: I2C data, write to push on write data FIFO, read to pull from read data FIFO
150+
data_valid: indicates valid read data, must be accessed with atomic 16 bit reads and writes
150151
data_last: indicate last byte of block write (write_multiple), must be accessed with atomic 16 bit reads and writes
151152
152153
Prescale register:
@@ -498,7 +499,7 @@ always @* begin
498499

499500
if (wbs_sel_i[1]) begin
500501
// only valid with atomic 16 bit write
501-
data_in_last_next = wbs_dat_i[8];
502+
data_in_last_next = wbs_dat_i[9];
502503
end else begin
503504
data_in_last_next = 1'b0;
504505
end
@@ -565,8 +566,9 @@ always @* begin
565566
3'h4: begin
566567
// data
567568
wbs_dat_o_next[7:0] = data_out;
568-
wbs_dat_o_next[8] = data_out_last;
569-
wbs_dat_o_next[15:9] = 7'd0;
569+
wbs_dat_o_next[8] = data_out_valid;
570+
wbs_dat_o_next[9] = data_out_last;
571+
wbs_dat_o_next[15:10] = 6'd0;
570572

571573
if (wbs_sel_i[0]) begin
572574
data_out_ready_next = !wbs_ack_o_reg && data_out_valid;

tb/test_i2c_master_wbs_16.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -254,16 +254,16 @@ def check():
254254
yield clk.posedge
255255

256256
data = wbm_inst.get_read_data()
257-
assert data[1] == b'\x11\x00'
257+
assert data[1] == b'\x11\x01'
258258

259259
data = wbm_inst.get_read_data()
260-
assert data[1] == b'\x22\x00'
260+
assert data[1] == b'\x22\x01'
261261

262262
data = wbm_inst.get_read_data()
263-
assert data[1] == b'\x33\x00'
263+
assert data[1] == b'\x33\x01'
264264

265265
data = wbm_inst.get_read_data()
266-
assert data[1] == b'\x44\x01'
266+
assert data[1] == b'\x44\x03'
267267

268268
yield delay(100)
269269

@@ -276,7 +276,7 @@ def check():
276276
wbm_inst.init_write(4, b'\x44\x00')
277277
wbm_inst.init_write(4, b'\x33\x00')
278278
wbm_inst.init_write(4, b'\x22\x00')
279-
wbm_inst.init_write(4, b'\x11\x01')
279+
wbm_inst.init_write(4, b'\x11\x02')
280280
wbm_inst.init_write(3, b'\x10')
281281

282282
yield wbm_inst.wait()
@@ -327,16 +327,16 @@ def check():
327327
yield clk.posedge
328328

329329
data = wbm_inst.get_read_data()
330-
assert data[1] == b'\x44\x00'
330+
assert data[1] == b'\x44\x01'
331331

332332
data = wbm_inst.get_read_data()
333-
assert data[1] == b'\x33\x00'
333+
assert data[1] == b'\x33\x01'
334334

335335
data = wbm_inst.get_read_data()
336-
assert data[1] == b'\x22\x00'
336+
assert data[1] == b'\x22\x01'
337337

338338
data = wbm_inst.get_read_data()
339-
assert data[1] == b'\x11\x01'
339+
assert data[1] == b'\x11\x03'
340340

341341
yield delay(100)
342342

0 commit comments

Comments
 (0)