在seq_item中基于2个随机变量构造变量

时间:2016-06-09 01:06:43

标签: system-verilog uvm

在我的序列中项目我有一个总线,它应该包含地址和数据。现在我想随机化地址和数据,然后在总线中连接它们的随机值。 请在seqItem类中帮助理解如何执行此操作。

class seqItem extends uvm_sequence_item;
    `uvm_object_param_utils(seqItem)

    rand logic [541-1:515] wfifo_addr;
    rand logic [512-1:0]  wfifo_data;
    logic [541-1:0] wfifo_dout; // = {this.wfifo_addr, 3'b000, this.wfifo_data};

    constraint wfifo_addr_ctrl {    ...    }

    constraint wfifo_data_ctrl {    ...    }
    …
endclass

那么如何让wfifo_dout包含wfifo_addrwfifo_data的随机值。 我必须保留单独的wfifo_addrwfifo_data信号,以便为它们创建随机化约束。

现在我从序列中为wfifo_dout赋值,这使seqItem事务随机化。但是,如果我可以在seqItem中创建wfifo_dout的值,那就太好了。

1 个答案:

答案 0 :(得分:4)

您可以做两件事:

  1. 创建一个post_randomize()方法,对wfifo_dout

    进行分配
    function post_randomize(); // called automatically after a call to randomize();
      wfifo_dout = {this.wfifo_addr, 3'b000, this.wfifo_data};
    endfunction
    
  2. 使用let语句声明地址和数据,而不是将它们作为单独的变量

    rand logic [541-1:0] wfifo_dout; 
    let wfifo_addr = wfifo_dout[541-1:515];
    let wfifo_data = wfifo_dout[512-1:0];