电路在时序模拟中表现不佳,但在行为模拟中表现良好-这是verilog的新功能
我是verilog开发的新手,在一个相对简单的计数器和触发器输出类型设计上,我很难看出哪里出了问题 这是verilog代码 注意:无论是否在没有内部输出缓冲区的输出信号上声明reg,代码都返回相同的结果电路在时序模拟中表现不佳,但在行为模拟中表现良好-这是verilog的新功能,verilog,fpga,hdl,vivado,Verilog,Fpga,Hdl,Vivado,我是verilog开发的新手,在一个相对简单的计数器和触发器输出类型设计上,我很难看出哪里出了问题 这是verilog代码 注意:无论是否在没有内部输出缓冲区的输出信号上声明reg,代码都返回相同的结果 `timescale 1ns / 1ps module testcounter( input wire clk, input wire resetn, input wire [31:0] num_to_count, out
`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
行为模拟看起来和我预期的一样
但是计时模拟爆炸了
好的措施是:实际的执行爆炸了,看起来像
任何提示都将不胜感激。谢谢大家。时序模拟和功能模拟之间的区别在于时序模拟模拟逻辑门的实际延迟,而功能模拟只是检查值是否正确 例如,如果你有一个简单的组合加法器,有两个输入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工具中使用。使用Xilinx Vivado 14.2时,您的代码似乎运行良好,但只有一个错误,即以下代码行
assign output_signal = internal_output_buffer;
您不能使用“分配”来分配寄存器,并且未定义“内部\u输出\u缓冲区”
我个人还建议在初始设置时将所有寄存器设置为某些值。变量“resetn”和“counter”最初没有赋值。例如,基本上像这样更改代码
reg [31:0] counter = 32'b0;
以下是我的结果和您的代码:
测试计数器中的verilog代码看起来已损坏:(a)您有多个驱动程序,(b)像@StrayPointer notices一样,您使用阻塞分配来分配寄存器(触发器)值 我猜您的意图如下,这可能会修复许多模拟不匹配:
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
模块测试计数器
(
输入线时钟,
输入线复位,
输入导线[31:0]个数到个数,
输出reg[7:0]输出信号
);
reg[31:0]计数器;
始终@(posedge clk或negedge resetn)开始
如果(!resetn)开始
计数器看起来你不能用半吉赫兹时钟运行32位计数器。检查最大时钟频率,它允许这个模块正常工作-你应该在编译报告中得到它。我对FPGA和Verilog还是很陌生,但看起来你在设计中使用了阻塞分配,这可能不会产生你想要的行为。查看“=”运算符和