小编Ald*_*doT的帖子

4
推荐指数
1
解决办法
978
查看次数

在从模式下实现UVM代理

我有一个实现的奴隶模型uvm_agent.通过"奴隶"我的意思是它不能自己发起交易.事务始终由另一方(主DUT)启动.所以它是一种被动代理(虽然它仍然能够传输回复数据包).
当从设备检测到来自DUT的数据包时,它将自动(基于其协议)与另一个数据包进行响应/回复.从属代理有一个监听器来监听DUT的启动转移.并且由于它能够传输数据包,因此从属代理也有一个驱动程序来发送应答数据包.

+------------+  master initiate transfer  +------------------------+
| Master DUT |  ------------------------> | UVM Agent - slave mode |
|            |                            | Monitor                |
|            |                            | Driver     Sequencer   |
+------------+                            +------------------------+


+------------+                            +------------------------+
| Master DUT |                            | UVM Agent - slave mode |
|            |   slave auto reply         | Monitor                |
|            | <------------------------- | Driver     Sequencer   |
+------------+                            +------------------------+
Run Code Online (Sandbox Code Playgroud)

我的问题是它如何发送回复数据包?直接来自它的司机?因为以uvm方式,驱动程序项始终来自正在执行来自用户测试级别的序列的顺控程序.但现在在这种情况下,没有序列 - 只有来自监视器的检测到的数据包.

我的第一个想法是,我需要提供一些反馈monitor,sequencer并在那里实现我的协议功能.
或者我应该直接将数据包传递monitordriver,并让它处理它并发送回复?如果是这样,我该怎么做?有没有更好的方法?

system-verilog uvm

3
推荐指数
1
解决办法
2761
查看次数

如何检查信号驱动强度?

我们如何检查电线上的信号驱动强度?可能吗?通常,我们只能检查电线的逻辑值,10使用条件检查==或三等于===.但它并没有告诉我们的实力,例如pull,strong或者weak

那么有没有办法检查驱动强度?例如,它将使用这样的东西:

wire a;
//... your a assignment
initial begin
//...
if (a && is_weak1(a)) $display("a is weak 1");
end
Run Code Online (Sandbox Code Playgroud)

verilog system-verilog

2
推荐指数
1
解决办法
3269
查看次数

always_comb 和 always@(*) 之间的行为差​​异

我刚刚发现 always@(*) 在涉及function.

请参阅下面的简单示例代码。

http://www.edaplayground.com/x/J7M

module test;
  reg a, b, c;

  function reg my_func();
    if (b==0) begin
      $display("DEBUG 0 @%0t", $time);
      return a;
    end
    else if (b==1) begin
      $display("DEBUG 1 @%0t", $time);
      return ~a;
    end
    else begin
      $display("DEBUG 2 @%0t", $time);
      return 0;
    end
  endfunction

  always @(*) begin
  //always_comb begin
    c = my_func();
  end

  initial begin
    a = 0; #10;
    a = 1; #10;
    a=0; 
  end
endmodule
Run Code Online (Sandbox Code Playgroud)

尝试在模拟always @(*)always_comb模拟之间切换。如果我使用always @(*),则不会显示任何内容。但是,如果我使用always_comb,它将显示如下预期结果: …

verilog system-verilog

2
推荐指数
1
解决办法
8113
查看次数

如何使用派生类约束检查类随机对象结果

假设我有这两个类:

class random_packet extends uvm_sequence_item;
    rand int cmd;
    ...
endclass
Run Code Online (Sandbox Code Playgroud)

及其扩展:

class good_packet extends random_packet;
    constraint good_constr {
    cmd inside {0,1,2};
    }
    ...
endclass
Run Code Online (Sandbox Code Playgroud)

(这里我不打算创建good_packet对象,但我只是想使用它的约束作为参考)然后我实例化random_packet对象并将其随机化:

random_packet pkt;
pkt = random_packet::type_id::create("pkt");
pkt.randomize();
Run Code Online (Sandbox Code Playgroud)

我的问题:是否有一种更简单的方法是利用其派生类good_packet的约束来检查结果是否pkt.cmd属于good_packet约束类别?这比编写冗余代码更好:

if (pkt.cmd == 0 || pkt.cmd == 1 || pkt.cmd == 2) $display("good");
else $display("bad");
Run Code Online (Sandbox Code Playgroud)

system-verilog uvm

1
推荐指数
1
解决办法
891
查看次数

标签 统计

system-verilog ×5

verilog ×3

uvm ×2