问题描述
我对“指定”的理解是,它控制了从输入到输出的传播延迟。
所以..
我希望下面的代码显示'o'在118处发生变化-即在'b'发生变化时108之后的10个时间单位 但改为将“ b”更改合并到115,这是更改之后10个单位。
>A T= 0 a 0 b 0 o x
>B T= 0 a 0 b 0 o x
O T= 10 a 0 b 0 o 0
>A T= 105 a 1 b 0 o 0
>B T= 108 a 1 b 1 o 0
O T= 115 a 1 b 1 o 2
我希望这个....
>A T= 0 a 0 b 0 o x
>B T= 0 a 0 b 0 o x
O T= 10 a 0 b 0 o 0
>A T= 105 a 1 b 0 o 0
>B T= 108 a 1 b 1 o 0
O T= 115 a 1 b 1 o 1
O T= 118 a 1 b 1 o 2
我误解了“指定”吗?
请参见https://www.edaplayground.com/x/eBUY
module check(a,b,o);
output wire [1:0] o;
input [1:0] a,b;
specify
( a => o ) = 10;
( b => o ) = 10;
endspecify
assign o = a + b;
always @ (a)
$display (">A T=%4t a %2d b %2d o %2d ",$time,a,o);
always @ (b)
$display (">B T=%4t a %2d b %2d o %2d ",o);
always @ (o)
$display (" O T=%4t a %2d b %2d o %2d ",o);
endmodule
module test;
wire [1:0] o;
logic [1:0] a,b;
check t1(.a,.b,.o);
initial begin
a = 0;
b = 0;
end
initial begin
#105 a = 1;
end
initial begin
#108 b = 1; // I EXPECT o TO CHANGE AS 108+10 BUT IT CHANGES AT 115
end
endmodule
=========
已更新...
似乎可以按我预期的方式工作的两种选择 请参见下文和https://www.edaplayground.com/x/P7kB
module check(a,o);
output reg [1:0] o;
input [1:0] a,b;
// OPTION 1 - put the delays on the individual wires
wire #10 a_delayed = a;
wire #10 b_delayed = b;
assign o = a_delayed + b_delayed;
// OPTION 2
// Use non-blocking with RHS delay as per https://www-inst.eecs.berkeley.edu/~cs152/fa06/handouts/CummingsHDLCON1999_BehavioralDelays_Rev1_1.pdf
// always @*
// o <= #10 a + b;
always @ (a)
$display (">A T=%4t a %2d b %2d o %2d ",o);
endmodule
选项1和2都产生相同的输出...
>A T= 0 a 0 b 0 o x
>B T= 0 a 0 b 0 o x
O T= 10 a 0 b 0 o 0
>A T= 105 a 1 b 0 o 0
>B T= 108 a 1 b 1 o 0
O T= 115 a 1 b 1 o 1
O T= 118 a 1 b 1 o 2
顺便说一句,这个问题实际上是这个问题所激发的更为复杂的用例的一部分。 我正在创建74HCT151的定时模型,并希望定时是准确的,因为我想生成发布的定时所隐含的稳定故障。
我应该为此创建一个单独的问题吗?
解决方法
指定路径延迟有两种形式: 平行连接a=>o
和完整连接a*>o
。 parallel 连接与编写a[0] => o[0]
和a[1] => o[1]
相同。没有从a[0] => o[1]
到b[0]=>o[1]
的路径。
在测试用例中,您正在更改a[0]
和b[0]
,但是o[1]
在更改,因为没有路径,所以延迟为0。此外,LRM第30.7节说
两个连续的计划转换在时间上比 模块路径延迟被视为脉冲。默认情况下,模块上的脉冲 路径输出被拒绝。
这就是o
直接从0
到2
的原因。您需要使用 Full 连接。
顺便说一句,当将=>
更改为*>
时,我无法在EDAPlayground上获得Icarus Verilog来匹配您的结果,也无法给我正确的结果,但是所有其他模拟器都可以使用。 >
更新
您的选项1过滤输入毛刺。如果a
或b
的毛刺少于10个时间单位,则这些毛刺将被滤除。您的选项2使所有输出毛刺通过,甚至0个延迟毛刺。如果要进行实际的脉冲滤波,则必须将specify
的路径延迟与$PATHPULSE
一起使用,显然iverilog不能正确实现。