在施加力之前分离SystemVerilog网络



我想从我的测试台上强制一个信号进入层次结构。模块是根据原理图自动创建的(不可能更改设计(,它们大多基于wire类型。

可以在EDA游戏平台上找到代码示例。

//top level module
module dummy1(input A, output B);
dummy2 u_dummy2(A, B);
always @(A)
begin
assert (A == 1'b0) else $error("Force reached this level");
end
endmodule
module dummy2(input A, output B);
dummy3 u_dummy3(A, B);
endmodule
module dummy3(input A, output B);
assign B  = A;  
endmodule

如果我在dummy3中强制A,它将改变dummy2dummy1中的A,这是意料之中的事情。我想知道是否有一种方法可以将dummy3中的Adummy2中的A分离,这样就不会对顶级模块施加力。

module dummy_tb;
logic A, B;
dummy1 u_dummy1(A, B); 
initial
begin
A = 0;    
$display("step0: A=%b B=%b", u_dummy1.A,u_dummy1.B);
#1;
//force A1 to 1
force u_dummy1.u_dummy2.u_dummy3.A = 1'b1;
#1;
$display("step1: A=%b B=%b", u_dummy1.A,u_dummy1.B);
release u_dummy1.u_dummy2.u_dummy3.A;
#1;
$display("step2: A=%b B=%b", u_dummy1.A,u_dummy1.B);
//TODO: find something to separate A in u_dummy3 from A in u_dummy2, then force
end
endmodule

我想不出办法"单独的";设计模块的Verilog源代码没有更改,但您也可以通过在dummy2:中强制A来实现类似的效果

#1;
//force A1 to 1
force u_dummy1.u_dummy2.u_dummy3.A = 1'b1;
force u_dummy1.u_dummy2.A = 1'b0; // <-------- add this line
#1;

埃达游乐场

我认为这种行为源于标准中的几句话

  1. 23.3.3端口连接规则:每个端口连接应为源到汇点的连续分配,其中一个连接项目应一个信号源,另一个应为信号汇点。该任务应为从输入或输出端口的源到汇。

这使dummy3.A成为接收器,dummy_tb.A成为源。

  1. 10.6.2强制和释放程序声明:网络上的强制程序声明应覆盖网络的所有驱动程序——门输出、模块输出、,以及连续分配——直到在网络上执行释放过程语句。当释放时,应立即将由网络驾驶员确定的值分配给网络。

这使得dummy_tb.A成为dummy3.A的驱动程序;因此,基本上,verilog是被迫在途中强制所有输入端口的。

因此,如果不将上述层次结构中的端口强制为不同的值,或者强制输出低级别模块中的连续分配(强制dummy3.B(,就无法执行您想要的操作。

最新更新