【verilog每日一练】repeat(n)@(posedge clk)和“#”控制仿真信号延时的区别 - FPGA开发者技术社区 - 电子技术论坛 - 广受欢迎的专业电子论坛
分享 收藏 返回

Mill 关注 私信
[问答]

【verilog每日一练】repeat(n)@(posedge clk)和“#”控制仿真信号延时的区别

请描述以下两种方法产生的信号有何区别
image.png

image.png

回帖(4)

jf_84491108

2023-9-12 09:05:08
这两种方法产生的信号的主要区别在于它们在时钟信号上的行为。

在第一种方法中,test 信号在 #90 时刻从 0 变为 1,然后在每个时钟信号的上升沿(posedge clk)被复制到 test_1d。这意味着 test_1d 将在 #90 时刻开始为 1,然后在接下来的 9 个时钟周期(因为 #10 clk = ~clk 意味着一个时钟周期为 10 纳秒)中保持为 1。

在第二种方法中,test 信号在 #0 时刻为 0,然后在 repeat(5) 循环的每个迭代中,当检测到时钟信号的上升沿时变为 1。这意味着 test 在前五个时钟周期中为 1(因为每个迭代包括一个时钟周期),然后在接下来的 5 个时钟周期中为 0。然后,与第一种方法相同,test_1d 在 #90 时刻开始为 1,并在接下来的 9 个时钟周期中保持为 1。

因此,这两种方法在前五个时钟周期和接下来的九个时钟周期的行为是相同的。然而,在从第 10 个到第 14 个时钟周期(对应于从 #90 到 #130),第二种方法将 test 和 test_1d 设置为 0,而第一种方法则保持它们为 1。因此,这两种方法在这四个时钟周期中的行为是不同的。

jf_99074111

2023-9-12 21:24:07
先说结论:
方法二repeat当时,test1d比方法一晚1个时钟周期变成1。

原因是:
首先方法一、二都定义了时钟周期为20ns。

方法一,在第90ns,test从0变1。在第100ns,也就是第5个时钟周期,test1d也会从0变成1。

而方法二,先用repeat等了5个时钟周期,然后把test从0变成1。因此需要等到第6个时钟周期,test1d才会从0变成1。

也就是方法二的test1d会比方法一晚1个时钟周期变成1。当然,test从0变1的时间点也不同。

Mill

2023-9-13 14:43:40
“#”是按仿真时间单位来控制rst_n信号的变化;repeat(n)@(posedge clk)是按时钟上升沿计数来控制rst_n信号的变化,使rst_n信号与clk同步。
解析:可通过仿真验证,在第五个时钟上升沿处,#(n)的写法,modelsim认为test信号已经为高电平,而repeat(n)@(posedge clk)的写法认为此时test信号仍为低电平,在信号“打拍”识别信号边沿的仿真过程中需注意两种写法的细节区别。

jefljel

2023-9-21 16:13:13
repeat(n)@(posedge clk)是一种使用重复循环控制时钟上沿触发的方式来控制仿真信号延时的方法,其中n表示重复的次数。这种方法在仿真时,会在时钟上沿触发后,重复执行n次,直到达到指定的次数,才会继续执行下一条语句。因此,使用repeat(n)@(posedge clk)生成的信号在仿真时会有一定的延时,并且延时的时间与n的值相关。

而“#”控制仿真信号延时的方法,是一种在代码中直接使用语句延时来控制信号延时的方法。其中#后面跟着的数字表示延时的时钟周期数。这种方法可以在仿真时直接控制信号的延时,而不受时钟周期数等因素的影响。但是需要注意的是,这种延时是绝对的,可能会与实际设计的时钟周期不同,因此需要谨慎使用。

因此,使用这两种方法产生的信号具有以下区别:

1. 延时时间不同。使用repeat(n)@(posedge clk)生成的信号在仿真时,延时时间与n的值相关;而使用“#”控制信号延时的方法,延时时间是绝对的,与n的值无关。

2. 延时精度不同。使用repeat(n)@(posedge clk)生成的信号在仿真时,由于受到时钟周期等因素的影响,延时精度可能会受到影响,不够精确;而使用“#”控制信号延时的方法,可以在仿真时直接控制信号的延时,具有更高的精度。

3. 使用方式不同。使用repeat(n)@(posedge clk)需要在代码中引入重复循环的语句,较为繁琐;而使用“#”控制信号延时的方法,只需要在需要延时的语句前加上“#”即可,使用较为简单。

更多回帖

×
发帖