Skip to content

Commit 3a053f2

Browse files
committed
CCC: ignore BCAST_SETAASA if address is set, set addresses to both targets
Signed-off-by: Karol Gugala <[email protected]>
1 parent 7570b6c commit 3a053f2

File tree

7 files changed

+120
-12
lines changed

7 files changed

+120
-12
lines changed

src/ctrl/ccc.sv

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ module ccc
194194
output logic [6:0] set_dasa_o,
195195
output logic set_dasa_valid_o,
196196
output logic set_dasa_virtual_device_o,
197+
output logic set_aasa_o,
198+
output logic set_aasa_virt_o,
197199

198200
// Target Reset Action
199201
// I3C_BCAST_RSTACT
@@ -321,7 +323,7 @@ module ccc
321323
logic set_dasa_valid;
322324
logic [6:0] set_dasa_addr;
323325
logic set_aasa_valid;
324-
logic [6:0] set_aasa_addr;
326+
logic set_aasa_virt_valid;
325327

326328
logic set_newda_valid;
327329
logic [6:0] set_newda_addr;
@@ -789,12 +791,11 @@ module ccc
789791
endcase
790792
end
791793

792-
// Connect dynamic address setter mux
793-
always_comb begin : dyn_addr_set_mux
794-
set_dasa_valid_o = set_aasa_valid ? set_aasa_valid : set_dasa_valid;
795-
set_dasa_o = set_aasa_valid ? set_aasa_addr : set_dasa_addr;
796-
set_dasa_virtual_device_o = is_byte_virtual_addr ? (set_aasa_valid ? set_aasa_valid : set_dasa_valid) : 1'b0;
797-
end
794+
assign set_dasa_valid_o = set_dasa_valid;
795+
assign set_dasa_o = set_dasa_addr;
796+
assign set_dasa_virtual_device_o = is_byte_virtual_addr ? set_dasa_valid : 1'b0;
797+
assign set_aasa_o = set_aasa_valid;
798+
assign set_aasa_virt_o = set_aasa_virt_valid;
798799

799800
// connect entdaa/setnewda
800801
always_comb begin: entdaa_setnewda_mux
@@ -939,8 +940,8 @@ module ccc
939940
always_ff @(posedge clk_i or negedge rst_ni) begin : bcast_ccc
940941
if (~rst_ni) begin
941942
rstdaa_o <= '0;
942-
set_aasa_addr <= '0;
943943
set_aasa_valid <= 1'b0;
944+
set_aasa_virt_valid <= 1'b0;
944945
end else begin
945946
case (command_code)
946947
`I3C_BCAST_RSTDAA: begin
@@ -955,10 +956,15 @@ module ccc
955956
// be set
956957
`I3C_BCAST_SETAASA: begin
957958
if (state_q == RxTbit && bus_rx_done_i) begin
958-
set_aasa_addr <= target_sta_address_i;
959-
set_aasa_valid <= 1'b1;
959+
if (~target_dyn_address_valid_i) begin
960+
set_aasa_valid <= 1'b1;
961+
end
962+
if (~virtual_target_dyn_address_valid_i) begin
963+
set_aasa_virt_valid <= 1'b1;
964+
end
960965
end else begin
961966
set_aasa_valid <= 1'b0;
967+
set_aasa_virt_valid <= 1'b0;
962968
end
963969
end
964970
default: begin

src/ctrl/controller.sv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,6 +224,8 @@ module controller
224224
output logic [6:0] set_dasa_o,
225225
output logic set_dasa_valid_o,
226226
output logic set_dasa_virtual_device_o,
227+
output logic set_aasa_o,
228+
output logic set_aasa_virt_o,
227229
output logic set_newda_o,
228230
output logic set_newda_virtual_device_o,
229231
output logic [6:0] newda_o,
@@ -559,6 +561,8 @@ module controller
559561
.set_dasa_o(set_dasa_o),
560562
.set_dasa_valid_o(set_dasa_valid_o),
561563
.set_dasa_virtual_device_o(set_dasa_virtual_device_o),
564+
.set_aasa_o(set_aasa_o),
565+
.set_aasa_virt_o(set_aasa_virt_o),
562566
.rstdaa_o(rstdaa_o),
563567
.set_newda_o,
564568
.set_newda_virtual_device_o,

src/ctrl/controller_standby.sv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ module controller_standby
147147
output logic [6:0] set_dasa_o,
148148
output logic set_dasa_valid_o,
149149
output logic set_dasa_virtual_device_o,
150+
output logic set_aasa_o,
151+
output logic set_aasa_virt_o,
150152
output logic set_newda_o,
151153
output logic set_newda_virtual_device_o,
152154
output logic [6:0] newda_o,
@@ -453,6 +455,8 @@ module controller_standby
453455
.set_dasa_o(set_dasa_o),
454456
.set_dasa_valid_o(set_dasa_valid_o),
455457
.set_dasa_virtual_device_o(set_dasa_virtual_device_o),
458+
.set_aasa_o(set_aasa_o),
459+
.set_aasa_virt_o(set_aasa_virt_o),
456460
.set_newda_o,
457461
.set_newda_virtual_device_o,
458462
.newda_o,

src/ctrl/controller_standby_i3c.sv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ module controller_standby_i3c
102102
output logic [6:0] set_dasa_o,
103103
output logic set_dasa_valid_o,
104104
output logic set_dasa_virtual_device_o,
105+
output logic set_aasa_o,
106+
output logic set_aasa_virt_o,
105107
output logic set_newda_o,
106108
output logic set_newda_virtual_device_o,
107109
output logic [6:0] newda_o,
@@ -528,6 +530,8 @@ module controller_standby_i3c
528530
.set_dasa_o (set_dasa_o),
529531
.set_dasa_valid_o (set_dasa_valid_o),
530532
.set_dasa_virtual_device_o (set_dasa_virtual_device_o),
533+
.set_aasa_o (set_aasa_o),
534+
.set_aasa_virt_o (set_aasa_virt_o),
531535
.rst_action_o,
532536
.rst_action_valid_o,
533537
.set_newda_o,

src/hci/hci.sv

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,8 @@ module hci
142142
input logic [6:0] set_dasa_i,
143143
input logic set_dasa_valid_i,
144144
input logic set_dasa_virtual_device_i,
145+
input logic set_aasa_i,
146+
input logic set_aasa_virt_i,
145147
input logic rstdaa_i,
146148
input logic [6:0] newda_i,
147149
input logic set_newda_i,
@@ -330,6 +332,16 @@ module hci
330332
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID.next = 1'b1;
331333
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR.we = set_newda_i && set_newda_virtual_device_i;
332334
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR.next = newda_i;
335+
end else if (set_aasa_i | set_aasa_virt_i) begin
336+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID.we = set_aasa_i;
337+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID.next = 1'b1;
338+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR.we = set_aasa_i;
339+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR.next = hwif_out_o.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.STATIC_ADDR.value;
340+
// Virtual device address
341+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID.we = set_aasa_virt_i;
342+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID.next = 1'b1;
343+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR.we = set_aasa_virt_i;
344+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR.next = hwif_out_o.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_STATIC_ADDR.value;
333345
end else begin
334346
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID.we = 1'b0;
335347
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID.next = '0;

src/i3c.sv

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -510,6 +510,8 @@ module i3c
510510
logic [6:0] set_dasa;
511511
logic set_dasa_valid;
512512
logic set_dasa_virtual_device;
513+
logic set_aasa;
514+
logic set_aasa_virt;
513515
logic set_newda;
514516
logic set_newda_virtual_device;
515517
logic [6:0] newda;
@@ -722,6 +724,8 @@ module i3c
722724
.set_dasa_o(set_dasa),
723725
.set_dasa_valid_o(set_dasa_valid),
724726
.set_dasa_virtual_device_o(set_dasa_virtual_device),
727+
.set_aasa_o(set_aasa),
728+
.set_aasa_virt_o(set_aasa_virt),
725729
.rstdaa_o(rstdaa),
726730
.set_newda_o(set_newda),
727731
.set_newda_virtual_device_o(set_newda_virtual_device),
@@ -865,6 +869,8 @@ module i3c
865869
.set_dasa_i(set_dasa),
866870
.set_dasa_valid_i(set_dasa_valid),
867871
.set_dasa_virtual_device_i(set_dasa_virtual_device),
872+
.set_aasa_i(set_aasa),
873+
.set_aasa_virt_i(set_aasa_virt),
868874
.rstdaa_i(rstdaa),
869875
.set_newda_i(set_newda),
870876
.set_newda_virtual_device_i(set_newda_virtual_device),

verification/cocotb/top/lib_i3c_top/test_ccc.py

Lines changed: 74 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -345,12 +345,25 @@ async def test_ccc_getmrl(dut):
345345
async def test_ccc_setaasa(dut):
346346

347347
STATIC_ADDR = 0x5A
348+
VIRT_STATIC_ADDR = 0x5B
348349
I3C_BCAST_SETAASA = 0x29
349350
i3c_controller, i3c_target, tb = await test_setup(dut)
350351
await ClockCycles(tb.clk, 50)
351352
dynamic_address_reg_addr = tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.base_addr
352-
dynamic_address_reg_value = tb.reg_map.I3CBASE.CONTROLLER_DEVICE_ADDR.DYNAMIC_ADDR
353-
dynamic_address_reg_valid = tb.reg_map.I3CBASE.CONTROLLER_DEVICE_ADDR.DYNAMIC_ADDR_VALID
353+
dynamic_address_reg_value = tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR
354+
dynamic_address_reg_valid = (
355+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID
356+
)
357+
virtual_dynamic_address_reg_addr = (
358+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.base_addr
359+
)
360+
virtual_dynamic_address_reg_value = (
361+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR
362+
)
363+
virtual_dynamic_address_reg_valid = (
364+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID
365+
)
366+
354367

355368
# reset Dynamic Address
356369
await i3c_controller.i3c_ccc_write(ccc=I3C_BCAST_SETAASA)
@@ -362,6 +375,65 @@ async def test_ccc_setaasa(dut):
362375
)
363376
assert dynamic_address == STATIC_ADDR, "Unexpected DYNAMIC ADDRESS read from the CSR"
364377
assert dynamic_address_valid == 1, "New DYNAMIC ADDRESS is not set as valid"
378+
virt_dynamic_address = await tb.read_csr_field(
379+
virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_value
380+
)
381+
virt_dynamic_address_valid = await tb.read_csr_field(
382+
virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_valid
383+
)
384+
assert virt_dynamic_address == VIRT_STATIC_ADDR, "Unexpected VIRT DYNAMIC ADDRESS read from the CSR"
385+
assert virt_dynamic_address_valid == 1, "New VIRT DYNAMIC ADDRESS is not set as valid"
386+
387+
388+
@cocotb.test()
389+
async def test_ccc_setaasa_ignore(dut):
390+
391+
STATIC_ADDR = 0x5A
392+
VIRT_STATIC_ADDR = 0x5B
393+
DYNAMIC_ADDR = 0x3A
394+
VIRT_DYNAMIC_ADDR = 0x3B
395+
I3C_BCAST_SETAASA = 0x29
396+
397+
i3c_controller, i3c_target, tb = await test_setup(dut)
398+
dynamic_address_reg_addr = tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.base_addr
399+
dynamic_address_reg_value = tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR
400+
dynamic_address_reg_valid = (
401+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID
402+
)
403+
virtual_dynamic_address_reg_addr = (
404+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.base_addr
405+
)
406+
virtual_dynamic_address_reg_value = (
407+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR
408+
)
409+
virtual_dynamic_address_reg_valid = (
410+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID
411+
)
412+
# set dynamic address CSRs
413+
await tb.write_csr_field(dynamic_address_reg_addr, dynamic_address_reg_value, DYNAMIC_ADDR)
414+
await tb.write_csr_field(dynamic_address_reg_addr, dynamic_address_reg_valid, 1)
415+
await tb.write_csr_field(virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_value, VIRT_DYNAMIC_ADDR)
416+
await tb.write_csr_field(virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_valid, 1)
417+
418+
# Send SETAASA
419+
await i3c_controller.i3c_ccc_write(ccc=I3C_BCAST_SETAASA)
420+
421+
# check if the address was not changed
422+
dynamic_address = await tb.read_csr_field(dynamic_address_reg_addr, dynamic_address_reg_value)
423+
dynamic_address_valid = await tb.read_csr_field(
424+
dynamic_address_reg_addr, dynamic_address_reg_valid
425+
)
426+
assert dynamic_address == DYNAMIC_ADDR, "Unexpected DYNAMIC ADDRESS read from the CSR"
427+
assert dynamic_address_valid == 1, "New DYNAMIC ADDRESS is not set as valid"
428+
429+
virt_dynamic_address = await tb.read_csr_field(
430+
virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_value
431+
)
432+
virt_dynamic_address_valid = await tb.read_csr_field(
433+
virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_valid
434+
)
435+
assert virt_dynamic_address == VIRT_DYNAMIC_ADDR, "Unexpected VIRT DYNAMIC ADDRESS read from the CSR"
436+
assert virt_dynamic_address_valid == 1, "New VIRT DYNAMIC ADDRESS is not set as valid"
365437

366438

367439
@cocotb.test()

0 commit comments

Comments
 (0)