Jump to content


  • Content count

  • Joined

  • Last visited

About Gunther

  • Rank
    Junior Member

Profile Information

  • Gender
    Not Telling
  1. Version


    This is the example code from the article "Flexible UVM Components: Configuring Bus Functional Models" in the Verification Horizon, June 2013.
  2. bug in uvm_rand_send* persists

    Thanks Uwe, I hadn't seen that. Good to see the bug fixed.
  3. bug in uvm_rand_send* persists

    Well, I think macros can't be evil, they are just a bit of code. Call it junk code if you like... And I think the macro names are quite self-explanaotry in what they do and I know I can basically code myself (thanks for extracting that info) what the macro hides. But none of that is to the point. The point is that those preople who decided what goes into uvm and what does not decided to put the macros in. Now they are in, so they should work. I think this is a bug and if that is indeed the case should be entered into the mantis database. Regards Gunther
  4. Hello, I have a problem with the uvm_send_rand macro. When I do a uvm_do_on_with (SEQ, SEQR, CONSTRAINTS) it works fine, but a combo of uvm_create_on (SEQ, SEQR) uvm_rand_send_with (SEQ, CONSTRAINTS) does not. There is a related post on this forum (http://www.uvmworld.org/forums/showthread.php?267-Virtual-Sequence-not-work-in-some-condition-with-uvm1.1) which points to Mantis 3633. It never mentions what the root cause is. Looking at the Mantis, it has been fixed in October 2011. However the problem persists in uvm1.1c, which has been released well after that date. I have traced the problem to the uvm_rand_send_pri_with (no surprises there), line 298 in uvm_sequence_defines.svh of uvm1.1c: else __seq.set_item_context(this); \ The macro uvm_do_on_pri_with does not have that function call, hence that works. This function call loses the sequencer information. It should be set_item_context (this, SEQR); The default for the 2nd argument is null, hence the test terminates with a DCLPSQ fatal. The problem is that the SEQR is unknown in uvm_do_on_pri_with, but is in uvm_do_on_pri_with. So I think that else branch has accidentally been added to the wrong macro and SEQR been omitted. Regards Gunther
  5. overwrite report_catcher

    I just realized I hadn't answered this one. That's a good point. Raising the component's verbosity sounds like a bit of a hack to me, but even without doing that it fixed half the problem. In my particular instance I was downgrading warnings to infos, so they are guaranteed to come through to the report catcher.
  6. dropping all objections

    Fair point, I hadn't known about this. On the other hand: Why should I not be allowed to do what I did? I still think this should work. And I am certainly NOT dropping the objection count below 0, so at the very least the error message is misleading. Gunther
  7. Hello, I've got an object which over the course of a test raises one or more objections. At some point, I need to drop all outstanding objections. It could be any amount outstanding, including none at all. To drop all outstanding objections, I thought I could just use the count paramter of drop_objection(), like so: drop_objection (this, .count (get_objection_count(this))); This works fine except when there are no outstanding objections on that object. A drop_objection (.count(0)) will result in an UVM_FATAL [OBJTN_ZERO] Object "..." attempted to drop objection count below zero. I have not found anything in the UVM documentation that I am not allowed to do this. (It does say must not go below 0, but I'm not doing that.) I have put the drop_objection() inside an if statement, that works fine. But should I really have to do this? I think a better solution would be to do this check inside function void m_drop() in uvm_objection.svh. Comments appreciated... Cheers Gunther
  8. Hi, I just came across this. I've never used it but it looks like this might provide the answer: You should then be able to run display_objection() on each element in the list. Cheers Gunther
  9. Oooops, uvm_top.set_report_*() does the trick. I should have known...
  10. Hello, I'm using the set_report_*_action*() functions to switch off some messages in some tests. This works fine if the message originates from within a component, but doesn't if it is handled by the global reporter. How do I do that? Do I have to write a report_catcher for that? Regards Gunther
  11. Could you please explain what you mean by "object array"? Do you mean the dynamic array itself?
  12. Hi there! I don't think there is a need to know the maximum transfer size in the transaction, certainly not to set the maximum size of the data payload. Consider a transaction with a dynamic array of logic[7:0] (or whatever you have) as payload. Any transaction would typically have a means of signalling the start and end of the transaction. Firstly, in the monitor, when you see the start of the transaction, you new() the transaction and you new() the payload. Then you collect the payload, resizing the payload variable each time. When you see the end of the transaction, you write it to the analysis_port. That way you never need more storage space than each individual transaction ever needs. Secondly, in the driver/sequencer, you would randomize the size of the payload anyway. You simply pin the size of your dynamic payload array to the same value. Job done. This has worked a treat in Questa for donkey's years. I know the Cadence guys tell you that you have to use a maximum-sized array, but it does work without. So in your transaction: rand logic [7:0] pl []; rand int unsigned pl_size; ... constraint c_payload {pl_size <= max_payload; pl.size == pl_size;} When you use that transaction, you can then do a constrain with {pl_size == 10;} to get a transaction with 10 byte payload. Sorry, you still may need a maximum size, but you can use the max size from the spec of the protocol you are using and it doesn't really matter how big it is. Most of the time you will use much less space for your transaction. You must constrain the size somewhere however, or you run the risk of getting a payload size of maxint. That'll kill your simulation speed... Hope that helps. Gunther
  13. overwrite report_catcher

    I uploaded a fixed server to the contributions section. Compile package and use with ens_report_server_pkg::ens_report_server:install_server();
  14. Fixed report server



    When changing verbosity in the report_catcher (including setting verbosity when changing severity to UVM_INFO), the reporting does not work as expected. This fixes it.
  15. Yes, of course that's possible, you could hardly have a scoreboard otherwise. The easiest thing to do is to use the im_decl macros.