Skip to content

tlm2 errror #33

Description

@shankar-arora

import uvm;
import esdl;
import std.stdio;

class test: uvm_test{
bool pass = 1;
mixin uvm_component_utils;

this(string name, uvm_component parent = null){
super(name, parent);
}

void strip_id(ref string s){
bool in_id = 0;
int i = 0;
bool p;

while(i<s.len()) {
  (s[i] >= '0' && s[i] <= '9') || s[i] == ' ')
  if(p==0)
{
  s[i]="X"; p=1;
}
  else {
s={s.substr(0,i-1),s.substr(i+1,s.len()-1)}; 
i--;
  }
  else
in_id=0;

if(s[i]=="@") { in_id=1; p=0; }
i++;   

}

void filter(ref string s1, ref string s2){
strip_id(s1);
strip_id(s2);
}

override void run_phase(uvm_phase phase){
uvm_tlm_gp obj1 = new uvm_tlm_gp("obj1"),
uvm_tlm_gp obj2 = new uvm_tlm_gp("obj2");

bool[] bits;
ubyte[] bytes;
int np, nu;

phase.raise_objection(this);

uvm_top.set_report_id_action("ILLEGALNAME", UVM_NO_ACTION);

writeln("\NUM_TRANS=%0d", NUM_TRANS);

for(int i=0; i<NUM_TRANS; i++){
  writeln("*** TRANS %0d ***",i);

  if(obj1.randomize() with {
  m_address >= 0 && m_address < 256; 
  m_length == NUM_TRANS; 
  m_data.size == m_length;
  (m_byte_enable_length % 4) == 0;
  m_byte_enable.size == m_byte_enable_length;
  foreach (m_byte_enable[i])
    m_byte_enable[i] <0  && m_byte_enable[i] > 255 };
m_streaming_width == m_length; 
} );

if(obj2.randomize() with {
m_address != obj1.m_address;
m_length == obj1.m_length-1;
m_data.size == m_length;
m_byte_enable_length <= m_length;
(m_byte_enable_length % 4) == 0;
m_byte_enable.size == m_byte_enable_length;
foreach (m_byte_enable[i])
  m_byte_enable[i] < 0 &&  m_byte_enable[i] >  255 };
  m_streaming_width == m_length; 
  } );

obj2.copy(obj1);

if(!obj1.compare(obj2))
uvm_fatal("MISCOMPARE",$sformatf("MISCOMPARE detected on generic payload!"));

{
string s1,s2;

s1 = obj1.convert2string();
s2 = obj2.convert2string();
if (s1 != s2)
  uvm_fatal("MISCOMPARE",$sformatf("convert2string different!\nobj1=%s\nobj2=%s",s1,s2))
}

s1 = obj1.sprint(uvm_default_tree_printer);
s2 = obj2.sprint(uvm_default_tree_printer);
filter(s1,s2);
if (s1 != s2)
uvm_fatal("MISCOMPARE",{"Sprint tree:\nobj1=\n",s1,"\nobj2=\n",s2});

s1 = obj1.sprint(uvm_default_line_printer);
s2 = obj2.sprint(uvm_default_line_printer);
filter(s1,s2);
if (s1 != s2)
uvm_fatal("MISCOMPARE",{"Sprint line:\nobj1=\n",s1,"\nobj2=\n",s2});
}

uvm_default_packer.use_metadata = 1;
uvm_default_packer.big_endian = i % 2;

uvm_info("TEST", format("Testing pack/unpack using %0s endian...", uvm_default_packer.big_endian) ? "big" : "little"), UVM_NONE)

obj2 = new obj("obj2");
np = obj1.pack(bits);
nu = obj2.unpack(bits);

if (!obj1.compare(obj2)) {
uvm_error("TEST", "pack/unpack MISCOMPARE");
obj1.print();
obj2.print();
}

if (np != nu) {
uvm_error("TEST", $sformatf("pack_bytes() packed %0d bits but unpacked %0d bits", np, nu))
}

void(obj1.begin_tr()){
obj1.m_data[i] = i;
obj1.end_tr();
}

uvm_info("TEST", "Checking content of packed byte stream...", UVM_LOW)
{
uvm_tlm_gp gp = new uvm_tlm_gp();

bytes = [0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
0x88, 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae,
0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae, 0xae
];

gp.set_address(0x0011_2233_4455_7788);
gp.set_write();
gp.set_data(bytes);
gp.set_data_length(16);
gp.set_streaming_width(1);
gp.set_byte_enable(bytes); // TECHNICALLY, byte_enables elements should be 00 or FF, nothing else
gp.set_byte_enable_length(16);
gp.set_dmi_allowed(1);
gp.set_response_status(UVM_TLM_BYTE_ENABLE_ERROR_RESPONSE);

uvm_default_packer.big_endian = 0;
void(gp.pack_bytes(bytes));

  writeln("Little Endian...\n");
  foreach (bytes[i])
     writeln(",%s'h%h", (i%8) ? " ": "\n", bytes[i]);

writeln("};\n");

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions