Skip to content

Commit 9d8f601

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 804d776 commit 9d8f601

File tree

7 files changed

+120
-13
lines changed

7 files changed

+120
-13
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;
@@ -801,12 +803,11 @@ module ccc
801803
endcase
802804
end
803805

804-
// Connect dynamic address setter mux
805-
always_comb begin : dyn_addr_set_mux
806-
set_dasa_valid_o = set_aasa_valid ? set_aasa_valid : set_dasa_valid;
807-
set_dasa_o = set_aasa_valid ? set_aasa_addr : set_dasa_addr;
808-
set_dasa_virtual_device_o = is_byte_virtual_addr ? (set_aasa_valid ? set_aasa_valid : set_dasa_valid) : 1'b0;
809-
end
806+
assign set_dasa_valid_o = set_dasa_valid;
807+
assign set_dasa_o = set_dasa_addr;
808+
assign set_dasa_virtual_device_o = is_byte_virtual_addr ? set_dasa_valid : 1'b0;
809+
assign set_aasa_o = set_aasa_valid;
810+
assign set_aasa_virt_o = set_aasa_virt_valid;
810811

811812
// connect entdaa/setnewda
812813
always_comb begin: entdaa_setnewda_mux
@@ -951,8 +952,8 @@ module ccc
951952
always_ff @(posedge clk_i or negedge rst_ni) begin : bcast_ccc
952953
if (~rst_ni) begin
953954
rstdaa_o <= '0;
954-
set_aasa_addr <= '0;
955955
set_aasa_valid <= 1'b0;
956+
set_aasa_virt_valid <= 1'b0;
956957
end else begin
957958
case (command_code)
958959
`I3C_BCAST_RSTDAA: begin
@@ -967,10 +968,15 @@ module ccc
967968
// be set
968969
`I3C_BCAST_SETAASA: begin
969970
if (state_q == RxTbit && bus_rx_done_i) begin
970-
set_aasa_addr <= target_sta_address_i;
971-
set_aasa_valid <= 1'b1;
971+
if (~target_dyn_address_valid_i) begin
972+
set_aasa_valid <= 1'b1;
973+
end
974+
if (~virtual_target_dyn_address_valid_i) begin
975+
set_aasa_virt_valid <= 1'b1;
976+
end
972977
end else begin
973978
set_aasa_valid <= 1'b0;
979+
set_aasa_virt_valid <= 1'b0;
974980
end
975981
end
976982
default: begin

src/ctrl/controller.sv

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,8 @@ module controller
230230
output logic [6:0] set_dasa_o,
231231
output logic set_dasa_valid_o,
232232
output logic set_dasa_virtual_device_o,
233+
output logic set_aasa_o,
234+
output logic set_aasa_virt_o,
233235
output logic set_newda_o,
234236
output logic set_newda_virtual_device_o,
235237
output logic [6:0] newda_o,
@@ -578,6 +580,8 @@ end
578580
.set_dasa_o(set_dasa_o),
579581
.set_dasa_valid_o(set_dasa_valid_o),
580582
.set_dasa_virtual_device_o(set_dasa_virtual_device_o),
583+
.set_aasa_o(set_aasa_o),
584+
.set_aasa_virt_o(set_aasa_virt_o),
581585
.rstdaa_o(rstdaa_o),
582586
.set_newda_o,
583587
.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/csri.sv

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,8 @@ module csri
5959
input logic [6:0] set_dasa_i,
6060
input logic set_dasa_valid_i,
6161
input logic set_dasa_virtual_device_i,
62+
input logic set_aasa_i,
63+
input logic set_aasa_virt_i,
6264
input logic rstdaa_i,
6365

6466
input logic [6:0] newda_i,
@@ -127,6 +129,16 @@ module csri
127129
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID.next = 1'b1;
128130
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR.we = set_newda_i && set_newda_virtual_device_i;
129131
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR.next = newda_i;
132+
end else if (set_aasa_i | set_aasa_virt_i) begin
133+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID.we = set_aasa_i;
134+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID.next = 1'b1;
135+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR.we = set_aasa_i;
136+
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;
137+
// Virtual device address
138+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID.we = set_aasa_virt_i;
139+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID.next = 1'b1;
140+
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR.we = set_aasa_virt_i;
141+
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;
130142
end else begin
131143
hwif_in.I3C_EC.StdbyCtrlMode.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID.we = 1'b0;
132144
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
@@ -519,6 +519,8 @@ module i3c
519519
logic [6:0] set_dasa;
520520
logic set_dasa_valid;
521521
logic set_dasa_virtual_device;
522+
logic set_aasa;
523+
logic set_aasa_virt;
522524
logic set_newda;
523525
logic set_newda_virtual_device;
524526
logic [6:0] newda;
@@ -760,6 +762,8 @@ module i3c
760762
.set_dasa_o(set_dasa),
761763
.set_dasa_valid_o(set_dasa_valid),
762764
.set_dasa_virtual_device_o(set_dasa_virtual_device),
765+
.set_aasa_o(set_aasa),
766+
.set_aasa_virt_o(set_aasa_virt),
763767
.rstdaa_o(rstdaa),
764768
.set_newda_o(set_newda),
765769
.set_newda_virtual_device_o(set_newda_virtual_device),
@@ -1097,6 +1101,8 @@ module i3c
10971101
.set_dasa_i(set_dasa),
10981102
.set_dasa_valid_i(set_dasa_valid),
10991103
.set_dasa_virtual_device_i(set_dasa_virtual_device),
1104+
.set_aasa_i(set_aasa),
1105+
.set_aasa_virt_i(set_aasa_virt),
11001106
.rstdaa_i(rstdaa),
11011107
.set_newda_i(set_newda),
11021108
.set_newda_virtual_device_i(set_newda_virtual_device),

verification/cocotb/top/lib_i3c_top/test_ccc.py

Lines changed: 74 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -325,15 +325,27 @@ async def test_ccc_getmrl(dut):
325325
assert ibi_payload_size == _IBI_PAYLOAD_SIZE
326326

327327

328-
@cocotb.test(skip=("ControllerSupport" not in cocotb.plusargs))
328+
@cocotb.test()
329329
async def test_ccc_setaasa(dut):
330330

331331
STATIC_ADDR = 0x5A
332+
VIRT_STATIC_ADDR = 0x5B
332333
I3C_BCAST_SETAASA = 0x29
333334
i3c_controller, i3c_target, tb = await test_setup(dut)
334335
dynamic_address_reg_addr = tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.base_addr
335-
dynamic_address_reg_value = tb.reg_map.I3CBASE.CONTROLLER_DEVICE_ADDR.DYNAMIC_ADDR
336-
dynamic_address_reg_valid = tb.reg_map.I3CBASE.CONTROLLER_DEVICE_ADDR.DYNAMIC_ADDR_VALID
336+
dynamic_address_reg_value = tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR
337+
dynamic_address_reg_valid = (
338+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID
339+
)
340+
virtual_dynamic_address_reg_addr = (
341+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.base_addr
342+
)
343+
virtual_dynamic_address_reg_value = (
344+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR
345+
)
346+
virtual_dynamic_address_reg_valid = (
347+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID
348+
)
337349

338350
# reset Dynamic Address
339351
await i3c_controller.i3c_ccc_write(ccc=I3C_BCAST_SETAASA)
@@ -346,6 +358,65 @@ async def test_ccc_setaasa(dut):
346358
assert dynamic_address == STATIC_ADDR, "Unexpected DYNAMIC ADDRESS read from the CSR"
347359
assert dynamic_address_valid == 1, "New DYNAMIC ADDRESS is not set as valid"
348360

361+
virt_dynamic_address = await tb.read_csr_field(
362+
virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_value
363+
)
364+
virt_dynamic_address_valid = await tb.read_csr_field(
365+
virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_valid
366+
)
367+
assert virt_dynamic_address == VIRT_STATIC_ADDR, "Unexpected VIRT DYNAMIC ADDRESS read from the CSR"
368+
assert virt_dynamic_address_valid == 1, "New VIRT DYNAMIC ADDRESS is not set as valid"
369+
370+
371+
@cocotb.test()
372+
async def test_ccc_setaasa_ignore(dut):
373+
374+
STATIC_ADDR = 0x5A
375+
VIRT_STATIC_ADDR = 0x5B
376+
DYNAMIC_ADDR = 0x3A
377+
VIRT_DYNAMIC_ADDR = 0x3B
378+
I3C_BCAST_SETAASA = 0x29
379+
380+
i3c_controller, i3c_target, tb = await test_setup(dut)
381+
dynamic_address_reg_addr = tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.base_addr
382+
dynamic_address_reg_value = tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR
383+
dynamic_address_reg_valid = (
384+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_DEVICE_ADDR.DYNAMIC_ADDR_VALID
385+
)
386+
virtual_dynamic_address_reg_addr = (
387+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.base_addr
388+
)
389+
virtual_dynamic_address_reg_value = (
390+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR
391+
)
392+
virtual_dynamic_address_reg_valid = (
393+
tb.reg_map.I3C_EC.STDBYCTRLMODE.STBY_CR_VIRT_DEVICE_ADDR.VIRT_DYNAMIC_ADDR_VALID
394+
)
395+
# set dynamic address CSRs
396+
await tb.write_csr_field(dynamic_address_reg_addr, dynamic_address_reg_value, DYNAMIC_ADDR)
397+
await tb.write_csr_field(dynamic_address_reg_addr, dynamic_address_reg_valid, 1)
398+
await tb.write_csr_field(virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_value, VIRT_DYNAMIC_ADDR)
399+
await tb.write_csr_field(virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_valid, 1)
400+
401+
# Send SETAASA
402+
await i3c_controller.i3c_ccc_write(ccc=I3C_BCAST_SETAASA)
403+
404+
# check if the address was not changed
405+
dynamic_address = await tb.read_csr_field(dynamic_address_reg_addr, dynamic_address_reg_value)
406+
dynamic_address_valid = await tb.read_csr_field(
407+
dynamic_address_reg_addr, dynamic_address_reg_valid
408+
)
409+
assert dynamic_address == DYNAMIC_ADDR, "Unexpected DYNAMIC ADDRESS read from the CSR"
410+
assert dynamic_address_valid == 1, "New DYNAMIC ADDRESS is not set as valid"
411+
412+
virt_dynamic_address = await tb.read_csr_field(
413+
virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_value
414+
)
415+
virt_dynamic_address_valid = await tb.read_csr_field(
416+
virtual_dynamic_address_reg_addr, virtual_dynamic_address_reg_valid
417+
)
418+
assert virt_dynamic_address == VIRT_DYNAMIC_ADDR, "Unexpected VIRT DYNAMIC ADDRESS read from the CSR"
419+
assert virt_dynamic_address_valid == 1, "New VIRT DYNAMIC ADDRESS is not set as valid"
349420

350421
@cocotb.test()
351422
async def test_ccc_getpid(dut):

0 commit comments

Comments
 (0)