Location

Interests

Biography

Location

Interests

Occupation

Company

Hi ,
To whom may correspond
I think there is some kind of error in the UVM 1.1d register model.
I have been experimenting with the UVM register model and i have seen the following code in uvm_reg_map.svh
task uvm_reg_map::do_bus_write (uvm_reg_item rw,
uvm_sequencer_base sequencer,
uvm_reg_adapter adapter);
uvm_reg_addr_t addrs[$];
uvm_reg_map system_map = get_root_map();
int unsigned bus_width = get_n_bytes();
uvm_reg_byte_en_t byte_en = -1;
uvm_reg_map_info map_info;
int n_bits;
int lsb;
int skip;
int unsigned curr_byte;
int n_access_extra, n_access;
int n_bits_init;
Xget_bus_infoX(rw, map_info, n_bits_init, lsb, skip);
addrs=map_info.addr;
// if a memory, adjust addresses based on offset
if (rw.element_kind == UVM_MEM)
foreach (addrs[i])
addrs[i] = addrs[i] + map_info.mem_range.stride * rw.offset;
foreach (rw.value[val_idx]) begin: foreach_value
uvm_reg_data_t value = rw.value[val_idx];
/* calculate byte_enables */
if (rw.element_kind == UVM_FIELD) begin
int temp_be;
int idx;
n_access_extra = lsb%(bus_width*8);
n_access = n_access_extra + n_bits_init;
temp_be = n_access_extra;
value = value << n_access_extra;
while(temp_be >= 8) begin
byte_en[idx++] = 0;
temp_be -= 8;
end
temp_be += n_bits_init;
while(temp_be > 0) begin
byte_en[idx++] = 1;
temp_be -= 8;
end
byte_en &= (1<<idx)-1;
for (int i=0; i<skip; i++)
void'(addrs.pop_front());
while (addrs.size() > (n_bits_init/(bus_width*8) + 1))
void'(addrs.pop_back());
end
curr_byte=0;
n_bits= n_bits_init;
The code continues but the interesting part is already there.
Lets assume we have a register with 4 bytes and 1byte per address granularity (byte_addressing).
Now, we do a FIELD access of 8bits length (the first byte of a register). The field is configured "individual_accessible, so UVM should only access that FIELD. The reg2bus should generate that byte request to be written.
In other words, the vector "addrs" should have only one byte address.
Going to the code, i see that initially the addrs has the 4 address ( the whole register) and when it comes to the "if (rw.element_kind == UVM_FIELD) begin" and it will pop_back()/remove all the exceeding bytes that doesn't need to complete "n_bits_init" of the field access.
The problem is here:
UVM has
//while (addrs.size() > (n_bits_init/(bus_width*8) + 1))
and i think it should be
while (addrs.size() > ((n_bits_init-1)/(bus_width*8) + 1)) //ejonalv possible error in UVM? check
That is because in case we want to write 8 bits, it will calculate 8/8+1=2 address in the UVM version, but in fact it should require only 1 address.
This is of course applicable for the READ variation.
Did i misunderstand something? It is very hard to go through the register model without proper documentation in the code.
I am looking forward your answer
Best Regards
Jonathan

Hi, I am using uvm standard register model , register adapter (bus2reg & reg2bus) to send and receive transaction to ral model and DUT. and it is working fine if i do single read and write.(means i perform the 32 bit read n write using reg.read(status,address,data)reg.write(status,address,data))
My challange is that i have to perform the more than 32 bit transaction which performs the read and write on multiple registers, If there any way to use the same reg.read/write method to perform more than one register

Hi All,
I am facing an issue:
One of the register field is configured as :
field_a.configure(this, 12, 17, "RO", 0, 12'h0, 1, 0, 1);
field_a.set_compare(UVM_NO_CHECK);
While doing a reset test, first I reset model then start test.
But test fails with :
UVM_ERROR -- value read from DUT (0x0000000080001e00) does not match mirrored value (0x00000000XxxXfe00)
Basically the fields declared as RO and UVM_NO_CHECK goes X ?
Any idea what I am missing or doing wrong ?
Thanks.

This download contains a sample UVM environment that shows the use of IDesignSpec Free to generate a UVM Register Model. The input can be SystemRDL, IP-XACT, Word, Excel, XML etc.
You can download the Free IDesignSpec Register Generator from here.
You can use the included example as a ready reference to generate your own register model.
You can use any or all of the IDesignSpec flavors: Word, Excel or Batch.

Hi Guys,
I am using UVM Register model to mimmick RTL's register implementation. Some registers are not implemented in RTL which are going to be connected to output port of some other module.
I have got a HDL path of register as an output port declaration of some module.
Something like:
The HDL path is: "tb_top.dut_u.interrupt_module_u.o_ext_interrupt"
o_ext_interrupt is declared as output port inside interrupt_module, which is not connected to any other wire or register.
Can this output port's value be changed by writing to it via UVM BACKDOOR ?
I am using following API:
register_name.write(status,data,UVM_BACKDOOR,default_map);
I dont see any change in value in the register. I think it is happening because the destination (o_ext_interrupt) is output of the module.
I am using Cadence's simulator: irun.
Please help if anyone is aware of such issue.
Regards,
Vismay.