【问题标题】:Circuit behaves poorly in timing simulation but alright in behavioral - new to verilog电路在时序仿真中表现不佳,但在行为方面表现良好 - verilog 的新手
【发布时间】:2014-11-23 02:14:03
【问题描述】:

我是 Verilog 开发的新手,在相对简单的计数器和触发器输出类型设计上看不到哪里出了问题。

这是verilog代码 请注意,无论 reg 是否在 output_signal 上声明而没有 internal_output_buffer,代码都会返回相同的结果

    `timescale 1ns / 1ps

module testcounter(
        input wire clk,
        input wire resetn,
        input wire [31:0] num_to_count,
        output reg [7:0] output_signal
    );

    reg [31:0] counter;

    initial begin
        output_signal = 0;
    end

    always@(negedge resetn) begin
        counter = 0;
    end

    always@(posedge clk) begin
        if (counter == num_to_count) begin
            counter = 0;
            if (output_signal == 0) begin
                output_signal = 8'hff;
            end
            else begin
                output_signal = 8'h00;
            end
        end
        else begin
            counter = counter + 1;
        end 


    end
    assign output_signal = internal_output_buffer;

endmodule

并且代码经过测试

 `timescale 1ns / 1ps

module testcounter_testbench(

    );
    reg clk;
    reg resetn;
    reg [31:0] num_to_count;
    wire [7:0] output_signal;

    initial begin
        clk = 0;
        forever #1 clk = ~clk;
    end

    initial begin
        num_to_count = 20;
    end

    initial begin
        #7 resetn = 1;
        #35 resetn = 0;
    end

    testcounter A1(.clk(clk),.resetn(resetn),.num_to_count(num_to_count),.output_signal(output_signal));
endmodule

行为模拟符合我的预期

但是时序仿真爆炸了

为了更好的衡量标准:实际探测到的执行会爆炸并且看起来像

任何提示将不胜感激。谢谢大家。

【问题讨论】:

  • 您似乎无法使用半千兆赫时钟和定时模型运行 32 位计数器。
  • 检查最大时钟频率,它允许这个模块正常工作 - 你应该在编译报告中得到它。
  • 我对 FPGA 和 Verilog 还是很陌生,但看起来您在设计中使用了阻塞分配,这可能不会产生您想要的行为。查看“=”运算符和“

标签: verilog fpga hdl vivado


【解决方案1】:

您的代码使用 Xilinx Vivado 14.2 似乎工作正常,但只有一个错误,即以下行

assign output_signal = internal_output_buffer;

您不能使用“assign”来分配寄存器,并且“internal_output_buffer”也没有定义。

我个人还建议在初始时将所有寄存器设置为某些值。您的变量“resetn”和“counter”最初没有分配。例如,基本上像这样更改您的代码

reg [31:0] counter = 32'b0;

这是我的代码结果:

【讨论】:

    【解决方案2】:

    时序仿真和功能仿真之间的区别在于,时序仿真模拟逻辑门的实际延迟,而功能仿真只是检查值是否正确。

    例如如果你有一个简单的组合加法器,有两个输入 a 和 b,输出 c。功能模拟会告诉您 c=a+b。和 c 将在 a 或 b 改变的精确微秒内改变。 但是,同一电路的时序仿真只会在一段时间 t 后显示 c 上的结果 (a+b),其中 t 是加法器的延迟。

    你的平台是什么?如果您使用的是 FPGA,则很难达到 500 MHz。你的时钟声明:

        forever #1 clk = ~clk;
    

    显示你每 1ns 切换一次时钟,这意味着你的周期是 2ns,你的频率是 500MHz。

    通过查找表、多路复用器和线段等 FPGA 资源的组合延迟可能超过 2ns。所以你的电路违反了时序约束并给出了错误的行为。

    我会尝试的第一件事是使用低得多的时钟频率,例如 100 MHz,然后再次测试电路。我希望它能产生正确的结果。

        forever #5 clk = ~clk;
    

    然后,要了解可以运行的最大安全频率,请通过运行时序分析查看设计工具中的编译报告。它适用于任何 FPGA CAD 工具。

    【讨论】:

      【解决方案3】:

      您在 testcounter 中的 verilog 代码看起来已损坏:(a) 您有多个驱动程序,并且 (b) 像 @StrayPointer 通知一样,您正在使用阻塞分配来分配寄存器(触发器)值。

      我猜你的意图如下,这可以解决很多模拟不匹配问题:

      module testcounter
      (
          input wire clk,
          input wire resetn,
          input wire [31:0] num_to_count,
          output reg [7:0] output_signal
      );
      
      reg [31:0] counter;
      
      always@(posedge clk or negedge resetn) begin
          if (!resetn) begin
              counter <= 0;
          end else begin
              if (counter == num_to_count) begin
                  counter <= 0;
              end else begin
                  counter <= counter + 1;
              end
          end
      end
      assign output_signal = (counter == num_to_count) ? 8'hff : 8'h00;
      
      endmodule
      

      【讨论】:

        猜你喜欢
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2021-12-16
        • 1970-01-01
        • 2023-01-26
        • 1970-01-01
        • 1970-01-01
        • 2023-01-20
        相关资源
        最近更新 更多