我想合成一个 SystemVerilog 代码,它的延迟写为 ##1 但合成器会给出语法错误,因为延迟是不可合成的。我想知道有什么方法可以给延迟合成吗?例如,这是代码中带有延迟的 SystemVerilog 断言
断言属性 ( ( req1 == 0 ) ##1( req1 == 1 ) ##1 !( req2 == 1 ) || ( gnt1 == 0 ) );
我怎样才能在不丢失其行为的情况下合成它?
我想合成一个 SystemVerilog 代码,它的延迟写为 ##1 但合成器会给出语法错误,因为延迟是不可合成的。我想知道有什么方法可以给延迟合成吗?例如,这是代码中带有延迟的 SystemVerilog 断言
断言属性 ( ( req1 == 0 ) ##1( req1 == 1 ) ##1 !( req2 == 1 ) || ( gnt1 == 0 ) );
我怎样才能在不丢失其行为的情况下合成它?
属性不是 Verilog 的一部分,而是 SystemVerilog 的一部分。更重要的是,属性本身也无法合成。属性在模拟环境中的cover
or语句中使用。assert
至于延迟,您唯一的选择是使用触发器来延迟信号。在您的财产##1
中意味着“在下一个边缘”,假设您的财产有一些与之相关的时钟(在封面/断言声明中或它在时钟块内)。
要在其他可合成的代码中创建可合成的周期延迟:
always@(posedge ck or posedge arst) begin
if(arst)
data_delayed <= '0;
else
data_delayed <= data;
end
你写的属性没有任何意义。您不能在布尔表达式的中间添加延迟。你的意思是写一个表达式序列吗?那么正确的语法是
sequence s1;
( ( req1 == 0 ) ##1( req1 == 1 ) ##1 !( req2 == 1 ) || ( gnt1 == 0 ) );
endsequence