Jump to content

Randomizing sequence items in UVM-SC


Recommended Posts

Hi All,

Just wanted to check if the UVM sequence macros (UVM_DO_ON_WITH and UVM_DO_WITH) which support randomizing the sequence object are yet supported by UVM-SC or not? If not, what is the best way to add some randomization in the framework? I saw a post where there are some snippets (link given below) using scvx_rand_object class but I am not sure where to find this(didn't find it in latest SCV and UVM-SC libraries). 

http://nascug.org/events/20th/1-NASCUG20-UVMforSystemC-Karsten.pdf

Also, I get errors while using plain UVM_DO_ON macros. Is it expected? The same works fine with ahb_wr_seq->start(top_env->agent->ahb_sequencer_inst);

I have registered the sequence class with factory already.

UVM_DO_ON(ahb_wr_seq,top_env->agent->ahb_sequencer_inst);

Error message says:

/nfs/iind/disks/ba_bdl_xplore_disk001/am5/UVM_SC/uvm-systemc-1.0-alpha1/src/uvmsc/macros/uvm_sequence_defines.h:150:31: error: expected type-specifier before ‘typeof’
   SEQ_OR_ITEM = dynamic_cast< typeof(SEQ_OR_ITEM) >(create_item(objw__, SEQR, "SEQ_OR_ITEM"));
                               ^
/nfs/iind/disks/ba_bdl_xplore_disk001/am5/UVM_SC/uvm-systemc-1.0-alpha1/src/uvmsc/macros/uvm_sequence_defines.h:115:3: note: in expansion of macro ‘UVM_CREATE_ON’
   UVM_CREATE_ON(SEQ_OR_ITEM, SEQR) \
   ^
/nfs/iind/disks/ba_bdl_xplore_disk001/am5/UVM_SC/uvm-systemc-1.0-alpha1/src/uvmsc/macros/uvm_sequence_defines.h:80:3: note: in expansion of macro ‘UVM_DO_ON_PRI_WITH’
   UVM_DO_ON_PRI_WITH(SEQ_OR_ITEM, SEQR, -1, "")
   ^
ahb_basic_test.h:59:11: note: in expansion of macro ‘UVM_DO_ON’
           UVM_DO_ON(ahb_wr_seq,top_env->agent->ahb_sequencer_inst);

 

Appreciate any help here.

Thanks

Akhila

Link to comment
Share on other sites

  • 2 months later...

I'm faced with the same question. But my sequence item is parameterized via template as follow:

template<unsigned DA_WIDTH>
class item_c: public uvm::uvm_sequence_item {
public:
    sc_uint<DA_WIDTH> addr;
...

I'm trying to use SCV_EXTENSIONS and scv_smart_ptr like Akhila do, but my scv_extensions class becomes not fully specialized in my case:

template<unsigned DA_WIDTH>
class scv_extensions<item_c<DA_WIDTH> > : public scv_extensions_base<item_c<DA_WIDTH> > {
public:
    scv_extensions<sc_uint<DA_WIDTH> > addr;
  ...

If understand it right, that will not work.

When I'm trying to create scv_smart_ptr like this:

scv_smart_ptr<item_c<DA_WIDTH> > req("req_item");

I'm receiving the following error:

_scv_smart_ptr.h:88:16: error: invalid new-expression of abstract class type ‘scv_extensions<item_c<16u> >’
     tmp_(&*ext_) {
                ^

Could somebody, please, explain me how to resolve this?

Probably, there are some more appropriate way to create a parameterized sequence item. 

Link to comment
Share on other sites

On 21/04/2017 at 6:01 PM, Loki5000 said:

I'm trying to use SCV_EXTENSIONS and scv_smart_ptr like Akhila do, but my scv_extensions class becomes not fully specialized in my case:

Did you include the required "extensions ctor" in your extension?

template<unsigned DA_WIDTH>
class scv_extensions<item_c<DA_WIDTH> > : public scv_extensions_base<item_c<DA_WIDTH> > {
public:
  scv_extensions<sc_uint<DA_WIDTH> > addr;
  // ...

  SCV_EXTENSIONS_CTOR(item_c<DA_WIDTH>) {
    SCV_FIELD(addr);
    // ...
  }
};

That said, (depending on your compiler) the current implementation of SCV_EXTENSIONS_CTOR is missing some "this->" qualifications in its body to cope with the different lookup rules for templated base classes.

Hope that helps,
  Philipp

Link to comment
Share on other sites

Yes, I did. Following the compiler (g++) errors descriptions I came to this:

template<>
template<unsigned DA_WIDTH>
class scv_extensions<item_c<DA_WIDTH> > : public scv_extensions_base<item_c<DA_WIDTH> > {
public:
    scv_extensions<op_t> op;
    scv_extensions<sc_uint<DA_WIDTH> > addr;
    scv_extensions<unsigned> delay;

    item_c<DA_WIDTH>* _instance;
    void _set_instance(item_c<DA_WIDTH>* p) { _instance = p; _set_instance_core_wrap(p); }
    item_c<DA_WIDTH>* _get_instance() const { return _instance; }

    SCV_EXTENSIONS_CTOR(item_c<DA_WIDTH>)
{
        SCV_FIELD(op);
        SCV_FIELD(addr);
        SCV_FIELD(delay);
    }
};

I defined another _instance, _set_instance and _get_instance functions. I'm not fully understand how, but it works.

The next problem is that I need one more data field in item_c class.

And it's of std::vector type. I didn't found a way to use std::vector type with SCV. Am I right? It's not possible with SCV?

The only way is to use CRAVE?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...