Beruflich Dokumente
Kultur Dokumente
Register Package
Agenda
Introduction to UVM UVM Register Model Our experience with using Register Model Register Model Generator
Verification Methodologies
History
February 2011 Accellera releases UVM 1.0 Recently, June 2011 UVM 1.1 is released
Introduction to UVM
Universal Verification Methodology
A methodology and a class library for building Advanced Reusable Verification Components
UVM Environment
Module top () as top level element. Test Class Contains Testbench Reusable components with different config
Whats in UVM ?
Base Classes Factory Classes Phasing Configuration TLM Sequences & Sequencers Message Reporting Register Model
Base Classes
Facilitate the design of modular, scalable, reusable verification environments The basic building blocks for all environments are components and the transactions they use to communicate
transactions
Factory Classes
Manufacture (create) UVM objects and components.
Only one instance of the factory is present in a given simulation
Phasing
Several new runtime phases in parallel with run_phase()
By default, all components must allow all other components to complete a phase before all components move to next phase
TLM
Unidirectional put/get interfaces TLM 2.0
Well-defined completion semantics
put Initiator
target
get
10
Sequencers
Arbiter for controlling transaction flow pull or push semantic between Driver
11
Message Reporting
Messages print trace information with advantages over $display:
Aware of its hierarchy/scope in testbench Allows filtering based on hierarchy, verbosity, and time
`uvm_info("PKT", "Packet Sent, UVM_LOW);
12
Agenda
Introduction to UVM UVM Register Model Our experience with using Register Model Register Model Generator
13
Register Model
Object oriented Shadow Model for Registers and Memories in DUT Components
Field Register Register File Memory Block
14
Register Model
BLK_1
R0 F1 F2 F3 F4 F10 F11 F10 F11
Registers
uvm_reg
R0 R1 ARR[0] ARR[1]
. . .
F10
F11
F5
F6
F7
F8
F9
F5
F6
F7
Register Arrays
F8
F9
. .
F5
F6
F7
F8
F9
ARR[n] RF0 [0] RF1 [0] RF0 [1] RF1 [1] RF0 [m] RF1 [m] MEM0
15
uvm_reg_block
MEM_0
BLOCK
F1 F2
. . .
R0
BLK_n
F3 F4 F11
uvm_reg_file
F5
F10
F10
F11
. . .
F10
F11
F6
F8
F7
F9
F5
F6
F7
F8
F9
F5
F6
F7
F8
F9
. .
F5
F6
F7
uvm_mem
F8 F9 MEM_0
Memory
MEM_0
Generator
Adapter
Bus Specific R/W
Backdoor
Bus Agent
16
Mirroring
Register model mirrors content of registers in DUT
Updated on read() and write() Scoreboard for checking Memories :
uvm_mem::peek() uvm_mem::poke()
R0 R1 Monitor Monitor Scoreboard
DUT
R0.read (. . .); ... R1.write (. . .); Sequence
R0
Sequencer Driver
APB
R1
17
Hardware writable
Counter, status flags
Scoreboard Monitor R0 R1 Monitor
DUT
R0.read (. . .); ... R1.write (. . .); Sequence
R0
Sequencer Driver
APB
R1
18
Agenda
Introduction to UVM UVM Register Model Our experience with using Register Model Register Model Generator
19
HDL Path
HDL path components are specified using the following methods: a) uvm_reg_block::configure() and uvm_reg_block::add_hdl_path() b) uvm_reg_file::configure() and uvm_reg_file::add_hdl_path() c) uvm_reg::configure() and uvm_reg::add_hdl_path_slice() d) uvm_mem::configure() and uvm_mem::add_hdl_path_slice() CODE: R0.clear_hdl_path(); R0.add_hdl_path_slice("dut.R0", 0, 32); R1.clear_hdl_path(); R1.add_hdl_path_slice("dut.R1", 0, 64);
R0 R1
Monitor
array name
And For Register Arrays:
DUT
Sequence
R0 R1
Sequencer Driver foreach (reg_array[i]) begin APB reg[i].clear_hdl_path(); reg[i].add_hdl_path_slice($sformatf(DUT_ARRAY[%0x]", i), 0, 32); end
20
Mapping in Block
byte-width of the bus
Base Address
APB_map = create_map("APB", h0, 4, UVM_LITTLE_ENDIAN, 1); APB_map_map.add_reg (R0, h0); APB_map.add_reg (R1, h4);
endianess
APB_map = create_map("APB", h0, 8, UVM_LITTLE_ENDIAN, 0); APB_map_map.add_reg (R0, h0); APB_map.add_reg (R1, h4); R0
R0 - 32 bit R1 - 64 bit
Monitor
If (Byte addressing == 0) then Bus width = Max size of Register in Register Model
Sequence
R1
DUT
R0
Sequencer Driver
APB
R1
21
Coverage
For all elements except in Register File Pre-defined Functional Coverage Type Identifiers
UVM_NO_COVERAGE No coverage models. UVM_CVR_FIELD_VALS Coverage models for UVM_CVR_REG_BITS values of fields. UVM_CVR_ADDR_MAP Coverage models for bits read or written UVM_CVR_ALL
in registers. All coverage models.
F1 F2
Block
R0 F3 . . R1 7 6 5 4 . R2 R3 F5 F8 F6 F7 F9 0x014 0x015 0x020 - 0x030 3 2 1 0 0x008
F4
0x000
MEM_0
22
Coverage
class my_reg_R1 extends uvm_reg; block_MEM0 extends uvm_mem; block_block extends uvm_reg_block; localuvm_reg_field F1; randblock_MEM0 MEM0; m_offset; uvm_reg_addr_t randblock_R1 R1; uvm_reg_field F2; covergroup cg_addr; rand uvm_reg_field F3; local uvm_reg_addr_t m_offset; QUADRANTS : coverpoint m_offset { covergroup cg_vals; bins FIRST = {[0:2]}; covergroup cg_addr; SECOND = F1: coverpoint F1.value[6:0];{[3:5]}; bins F2: coverpoint F2.value[13:0];m_offset { block_MEM0 : coverpoint{[6:8]}; bins THIRD = F3: coverpointhit = FOURTH = {[9:11]}; bins F3.value[19:0]; 'h47] }; bins { ['h18 : endgroup} } endgroupblock_reg1 : coverpoint m_offset { function new(string name = "my_reg_R1"); bins hit = { h4 }; function}new(string name = "block_mem_reg"); super.new(name, 32, build_coverage( UVM_CVR_FIELD_VALS)); endgroup super.new(name, 'h30, 32, "RW", build_coverage(UVM_CVR_ADDR_MAP)); . . . function new(string name = "block_block"); endfunction super.new(name, if (has_coverage(UVM_CVR_ADDR_MAP)) build_coverage(UVM_CVR_ADDR_MAP)); virtual functionnew();sample(uvm_reg_data_t data, cg_addr = void if (has_coverage(UVM_CVR_ADDR_MAP)) uvm_reg_data_t byte_en, endfunction = new(); cg_addr bit is_read, endfunction uvm_reg_map map); `uvm_object_utils(block_MEM0) if (has_coverage(UVM_CVR_FIELD_VALS)) virtual function void sample(uvm_reg_addr_t cg_vals.sample(); offset, bit is_read, uvm_reg_map map); virtual function void sample(uvm_reg_addr_t endfunction offset,(get_coverage(UVM_CVR_ADDR_MAP)) begin if bit is_read, uvm_reg_map map); virtual functionoffset; ifm_offset = void sample_values();begin (get_coverage(UVM_CVR_ADDR_MAP)) super.sample_values(); cg_addr.sample(); m_offset = offset; end(get_coverage(UVM_CVR_FIELD_VALS)) ifcg_addr.sample(); end cg_vals.sample(); endfunction . . . endclass : block_block endclass
Register
R0 R1 ARR[0] ARR[1]
Register Arrays
ARR[n] RF0 [0] RF1 [0] RF0 [1] RF1 [1] RF0 [m] RF1 [m] MEM0
23
Register File
F5
F6
F8
F7
F9
Memory
MEM_0
Pre-Defined Sequences
Factory given Sequences
hdl_path Access needed
uvm_resource_db#(bit)::set({"REG::",regmodel.blk.r0.get_full_name()}, "NO_REG_TESTS", 1, this);
SEQUENCES
uvm_reg_hw_reset_seq uvm_reg_bit_bash_seq uvm_reg_access_seq uvm_mem_walk_seq uvm_mem_access_seq uvm_reg_mem_built_in_seq uvm_reg_mem_hdl_paths_seq
ATTRIBUTES
NO_REG_TESTS NO_MEM_TESTS NO_REG_HW_RESET_TEST NO_REG_BIT_BASH_TEST NO_REG_ACCESS_TEST NO_MEM_WALK_TEST NO_MEM_ACCESS_TEST
24
Special Registers
Pre-Defined Registers
Indirect Indexed Registers
class my_blk extends uvm_reg_block; ind_idx_reg IND_IDX; ind_data_reg IND_DATA; ind_reg INDIRECT_REG[256]; virtual function build(); . . `ifdef INCA begin uvm_reg r[256]; my_blk foreach(INDIRECT_REG[i]) r[i]=INDIRECT_REG [i];
0x04
IND_DATA.configure(IND_IDX, r, this, null); end `else IND_DATA.configure(IND_IDX, INDIRECT_REG , this, null); `endif . . default_map = create_map(, 0, 4, UVM_BIG_ENDIAN); default_map.add_reg(IND_IDX, 0); default_map.add_reg(IND_DATA, 4); endclass
data
25
Special Registers
Aliased Registers
cont. .
Accessible from multiple addresses in the same address map. Fields in aliased registers will have different behavior depending on the address used to access them.
class my_blk extends uvm_reg_block; rand my_reg_Ra Ra; rand class my_reg_Ra extends uvm_reg; my_reg_Rb Rb; virtual rand uvm_reg_field F1; function build(); . . . .. . . . F1.configure(this, 8, 0, default_map.add_reg(Ra, h0100); "RW", . . .); endfunction default_map.add_reg(Rb, h0200); endclass begin class my_reg_Rb extends uvm_reg; alias_RaRb RaRb; uvm_reg_field F1; RaRb = . . . . alias_RaRb::type_id::create("RaRb",,get_full_name()); F1.configure(this, RaRb.configure(Ra, Rb); 8, 0, "RO", . . .); endfunction end endclass endfunction endclass
R0
F1
F2
F3
F4
Ra
F10 F10
h100
F11 F11
Rb
F10
Aliased Registers
h200
F11
26
Special Registers
FIFO
class fifo_reg extends uvm_reg_fifo; function new(string name = "fifo_reg"); super.new(name,8,32,UVM_NO_COVERAGE); endfunction: new `uvm_object_utils(fifo_reg) endclass
27
Agenda
Introduction to UVM UVM Register Model Our experience with using Register Model Register Model Generator
28
GENERATOR
EDA Vendors
29
30
Synopsys : Ralgen
RALF to UVM
Agnisys : IDSExcel
Excel to UVM
31
Summary
UVM register package must be used for any serious SoC verification Not using a register model is painful Not using a generated register model is very painful
Any questions?
32
33
34
cont. .
35
Scoreboard
DUT
Sequence
R0
Sequencer Driver
APB
R1
36
Introspection
37
Special Registers
Aliased Registers
cont. .
class write_also_to_F extends uvm_reg_cbs; local uvm_reg_field m_toF; function new(uvm_reg_field toF); m_toF = toF; endfunction class my_blk extends uvm_reg_block; virtual function void post_predict(uvm_reg_field fld, uvm_reg_data_t value, rand my_reg_Ra Ra; uvm_predict_e kind, rand my_reg_Rb Rb; uvm_path_e path, virtual function build(); uvm_reg_map map); default_map = create_map("", 0, 4, UVM_BIG_ENDIAN); if (kind != UVM_PREDICT_WRITE) return; Ra = reg_Ra::type_id::create("Ra",,get_full_name()); void'(m_toF.predict(value, -1, UVM_PREDICT_WRITE, path, map)); . . . endfunction Rb = reg_Rb::type_id::create("Rb",,get_full_name()); class alias_RaRb extends uvm_object; endclass . . . protected reg_Ra m_Ra; default_map.add_reg(Ra, h0100); Ra h100 protected reg_Rb m_Rb; default_map.add_reg(Rb, h0200); Aliased `uvm_object_utils(alias_RaRb) Registers function new(string name = "alias_RaRb"); begin Rb h200 super.new(name); alias_RaRb RaRb; endfunction: new RaRb = alias_RaRb::type_id::create("RaRb",,get_full_name()); function void configure(reg_Ra Ra, reg_Rb Rb); RaRb.configure(Ra, Rb); write_also_to_F F2F; end m_Ra = Ra; endfunction m_Rb = Rb; endclass F2F = new(Rb.F1); uvm_reg_field_cb::add(Ra.F1, F2F); endfunction : configure endclass : alias_RaRb
R0 F1 F2 F3 F4 F10 F11 F10 F11 F10 F11
38