
1 现象:
仿真在140ns位置处,时钟clk上升沿一来,data_in和data_in_reg同步变化? 但是,data_in_reg为寄存器,它与数据源data_in同时变化,这与寄存器赋值会有一拍延时相矛盾。例如:cnt与data_out两个信号,data_out比cnt延时一拍。
2 原因
由于data_in不是由寄存器驱动的,而是在testbench中直接赋值,modelsim在分析时,认为此时data_in的值已经更新为1,故将data_in直接赋值给data_in_reg,在理想仿真情况下,寄存器的输入与输出没有延时,data_in_reg更新为1。
3 解决:
1)在testbench中错开时钟沿赋值;


2)在RTL中加入#1延迟;

 
4 相关程序
1)设计程序
 1 module register_test(
 2     input        wire            clk,
 3     input     wire            rst_n,
 4     input     wire     [7:0]    data_in,
 5     output     reg     [7:0]    data_in_reg,
 6     output     reg     [7:0]    data_out
 7 );
 8 
 9     reg        [7:0]        cnt;
10     
11     always@(posedge clk or negedge rst_n)begin
12         if(!rst_n)
13             data_in_reg <= 8'd0;
14         else
15             data_in_reg <= data_in;
16     end
17     
18     always@(posedge clk or negedge rst_n)begin
19         if(!rst_n)
20             cnt <= 8'd0;
21         else
22             cnt <= cnt + 1'b1;
23     end
24     
25     always@(posedge clk or negedge rst_n)begin
26         if(!rst_n)
27             data_out <= 8'd0;
28         else
29             data_out <= cnt;
30     end
31 
32 endmodule 1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.2)仿真程序
 1 `timescale 1ns/1ns
 2 
 3 module register_test_tb();
 4 
 5     reg                        clk;
 6     reg                        rst_n;
 7     reg                 [7:0]    data_in;
 8     wire                 [7:0]    data_in_reg;
 9     wire                 [7:0]    data_out;
10 
11     integer             i;
12     
13     register_test register_test_inst(
14         .clk                    (clk),
15         .rst_n                (rst_n),
16         .data_in                (data_in    ),
17         .data_in_reg        (data_in_reg),
18         .data_out            (data_out)
19     );
20 
21     initial clk = 1;
22     always #10 clk = ~clk;
23     
24     initial begin
25         rst_n = 0; data_in = 0;
26         #100; rst_n = 1;
27         #20;
28         for(i=0;i<15;i=i+1)begin
29             data_in = i;
30             #20;
31         end
32         #20;
33         $stop;
34     end
35 
36 endmodule1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删