coverify / euvm

Embedded UVM (D Language port of IEEE UVM 1.0)
Apache License 2.0
30 stars 14 forks source link

tlm2 errror #33

Open shankar-arora opened 8 years ago

shankar-arora commented 8 years ago

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");