102 User Experiences With The Portable Stimulus Standard
102 User Experiences With The Portable Stimulus Standard
Eventually: eventually m
m
- Some time in the future
- Match m from everywhere, starting from the current point
100:1/3
101:1/3, 200:2, 300:5
102:1/3
action my_test {
activity {
do mem2mem_chain with { xfer.size > 10; };
}
}
dma_c::mem2mem_xfer
action configX {
output config_s out_cfg;
constraint out_cfg == X; bringup
} bringup
action B {
input config_s cfg;
constraint cfg.mode == X; A
}
configX A
action my_stress_seq {
activity {
do bringup; configX
do A; mode X
do B; mode X Stress is not achieved
} B should start immediately because relevant
}
after A completes – it’s a B B
critical aspect of the intent behavior is spaced
In reality B may
start long after apart or diluted
A completes
Tag/Addr_value
Enum base type
Floating Point computation and storage types
- Auto framing and eye gaze correction with Microsoft Teams Compute Compute Compute Compute
- Low power background blur, audio noise reduction, etc. Compute Compute Compute Compute
Subsystem PSS
- AIE array with an embedded processor running C code
with UVM/C++ environment Registers AIE array
Full SoC
NOC
- X86 processors, AIE subsystem, and rest of chip
- C code running on x86 and embedded processor NOC
Address
Post-silicon bring-up and validation Translation
Embedded
Processor
SoC
Comm
- C code running on the main and embedded processor
X86 cores
Generate traffic
- Run M parallel DMAs and check the results
- Select valid routes from the last step
Address Embedded
Translation SoC
Processor Comm
aie_tile_region.trait.mem_block = COMPUTE_TILE;
aie_tile_region.trait.row = row + COMPUTE_TILE_START_ROW;
aie_tile_region.trait.col = col;
exec body {
(void)mem.add_region(tile_region); comp.regs.SOME_REG.write_val(0xdeadc0de);
}; …
}; write32(mem_handle, 0x12345678);
}
transparent_addr_region_s<mem_trait_s> sysmem_region;
(void)sysmem.add_region(sysmem_region);
...
26 © 2023 Accellera Systems Initiative, Inc.
AIE Subsystem PSS integration
component pss_top {
exec body {
transparent_addr_space_c<aie_mem_trait_s> mem;
comp.regs.SOME_REG.write_val(0xdeadc0de);
transparent_addr_space_c<mem_trait_s> sysmem;
…
write32(mem_handle, 0x12345678);
exec init_down {
}
// Add PSS executors to map to Embedded Processor
// May have some tool-specific setup for integration
// Call to add_executor exec body {
... *(volatile uint32_t*) SOME_REG_ptr = 0xdeadc0de;
*(volatile uint32_t*) mem_handle_ptr = 0x12345678;
// Memory setup }
repeat(col: COMPUTE_TILE_COLS) {
repeat (row: COMPUTE_TILE_ROWS) {
transparent_addr_region_s<mem_trait_s> tile_region;
aie_tile_region.size = COMPUTE_MEM_SIZE;
aie_tile_region.addr = TLB(compute_tile_base(row, col));
Registers AIE array
aie_tile_region.trait.mem_block = COMPUTE_TILE;
aie_tile_region.trait.row = row + COMPUTE_TILE_START_ROW;
NOC
aie_tile_region.trait.col = col;
(void)mem.add_region(tile_region);
}; NOC
};
transparent_addr_region_s<mem_trait_s> sysmem_region; Address
Embedded SoC
(void)sysmem.add_region(sysmem_region); Translation
Processor Comm
...
}
}
27 © 2023 Accellera Systems Initiative, Inc.
SoC PSS integration
Multiple executors
- One embedded processor and a few x86 processors
Registers AIE array
Two test compilation units
- Tool-specific setup to generate test code for x86 and embedded control NOC
processor
Address Embedded
- Tool-specific implementation, usually memory-based mailboxes Translation Processor
SoC
Comm
AIE array
Memory
Test action Compute Compute Compute Compute
dma_mem2Shim
exec_init
dma_shim2compute Control Processor
…
Subsystem
setup_circuits
aie_profile_state_s aie_circuit_state_s
num_isolation_groups 1
mem2stream stream2mem
sysmem2computetile_dma_p
check_dma
Flow Object
Data flow
Test action
Control flow
Inferred action
- Constraints for isolation and circuits in the state object rand array<circuit_node_s, MAX_CIRCUITS> src;
rand array<circuit_node_s, MAX_CIRCUITS> dst;
- DMA actions have an input state object but no output
rand int in [1..MAX_CIRCUITS] parallel_count;
state
activity {
Tip parallel {
replicate(i: parallel_count) {
- A generic DMA action, that inputs the current state do compute_tile::mem_to_stream with {node == src[i];}
manipulates it, and then outputs it, is not always a good do compute_tile::stream_to_mem with {node == dst[i];}
}
solution for high-level test space modeling with PSS }
- This generic action is very procedural that unnecessarily }
}
adds to constraint-solving complexity
- Be cognizant of PSS global constraint-solving semantics
• Constraint space and usability concerns affect the Test API design most
• Quick iterations on API design is highly desirable
• Level 1
• Fully encapsulated sub-IP or IP model with registers, initialization, and programming sequences
• E.g., compute, mem, and shim tile PSS components with mem_to_stream and stream_to_mem
actions
• Not directly used to create tests
• Level 2
• Main test writers' interface
• For example, sysmem2computetile_dma_parallel action from AIE component
• Level 3
• Simplified high-level test interface used by the architect, SoC DV, and post-silicon
• DMA action to do DMA from a given tile to another tile
CONSTRAINTS
- Which basket is bad is not important rand array<int in [1..MAX_MANGO], MAX_BASKET> baskets;
all rand attributes that satisfy the rand int in [0..MAX_BASKETS] num_good_baskets;
}
constraints
The possibility space of the cross of rand Size of constraint space = MAX_MANGO *
attributes domain size is the constraint MAX_BASKET *
space MAX_BASKET * 2
MAX_BASKET
action eat_good_mangoes {
}
group_sizes[i] >= 1;
}
} -1 -1 -1 -1
}
exec post_solve {
constraint col_index[0] == 0;
printf("################ Isolation profile ##################\n");
constraint foreach (g:isolation_profile[i]) { printf("No of isolated col groups: %d\n", no_of_groups);
if(group_sizes[i] > 0) { foreach (g:isolation_profile[i]) {
if(i < no_of_groups) { if(group_sizes[i] > 0) {
foreach (g[j]) { outf("(");
if(j < group_sizes[i]) {
if(i ==0 && j == 0) { foreach (g[j]) {
col_index[0] == 0; if(j < group_sizes[i]) {
} outf("%d,",g[j]);
else { }
col_index[i*NO_OF_COL + j] == col_index[i*NO_OF_COL + j - 1] + 1; }
} }
} }
else { }
col_index[i*NO_OF_COL + j] == col_index[i*NO_OF_COL + j - 1]; };
}
}
}
}
}
41 © 2023 Accellera Systems Initiative, Inc.
Constraint efficiency:
a simple efficient solution
// Stores the last column of an isolation group
rand array <int in [0..MAX_ISOLATION_GROUPS-1], MAX_ISOLATION_GROUPS> last_elem_of_group;
// Used for forcing DMAs into isolations so they aren't empty if we want
rand int in [1..MAX_ISOLATION_GROUPS] num_nonempty_groups;
// Ensure groups are continuous and don't skip over each other
constraint foreach(gb:last_elem_of_group[i]) {
Compact representation
of the solution
if(i < MAX_ISOLATION_GROUPS-1) { // Only look at valid isolation groups
if( i < num_nonempty_groups-1) { // Only look at non-empty groups
// last column of a group must be less than last column of the next group
last_elem_of_group[i] < last_elem_of_group[i+1];
}
else { One group of all columns Last element of group
// group everything that is not valid
last_elem_of_group[i] == last_elem_of_group[i+1]; [0, 1, 2, 3] 3 X X X
}
}
}
// Last element of the last isolation group must be the last column
constraint last_elem_of_group[MAX_ISOLATION_GROUPS-1] == MAX_ISOLATION_GROUPS-1;
0 1 2 3 3 X X X 0 1 -1 -1 1 3 X X
-1 -1 -1 -1 2 3 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
-1 -1 -1 -1 -1 -1 -1 -1
0 -1 -1 -1 0 -1 -1 -1
0 1 2 3 0 2 3 X
1 -1 -1 -1 1 2 -1 -1
2 -1 -1 -1 3 -1 -1 -1
3 -1 -1 -1 -1 -1 -1 -1
The symmetry of the solution space presents a bigger search space for constraint solver
Design PSS model to only expose important random attributes to the next integration level
- A poorly designed constraint model could easily overwhelm current and future constraint solvers
- Only allow free random attributes at system-level that are important for system-level tests
PSS METHODOLOGY
Create high-level open action libraries for the standard protocols that work across vendors
- PCIe, CXL, UCIe, etc.
Improve PSS action export methodology for use in the production firmware
States: Actions:
7 component BasicIP {
8 pool state_t fsmState;
Enhancements for a new project? 23 output state_t outState; constraint outState == Ready;
24 };
25 };
Base Model + Extend vs. Override
26 };
53 © 2023 Accellera Systems Initiative, Inc.
Extend vs. Override in modeling logic
- Resources 11 };
12 };
13 };
- Target types
// Platform 2 (Pre-si testbench)
Testbench/ Feature
Realization Enhancements/
Layer Changes