在非可合成代码中,有什么区别:
@(a==1);
Run Code Online (Sandbox Code Playgroud)
和
@(posedge a);
Run Code Online (Sandbox Code Playgroud)
他们真的表现得一样吗?
我有一个实现的奴隶模型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并在那里实现我的协议功能.
或者我应该直接将数据包传递monitor给driver,并让它处理它并发送回复?如果是这样,我该怎么做?有没有更好的方法?
我们如何检查电线上的信号驱动强度?可能吗?通常,我们只能检查电线的逻辑值,1或0使用条件检查==或三等于===.但它并没有告诉我们的实力,例如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) 我刚刚发现 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,它将显示如下预期结果: …
假设我有这两个类:
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)