一个简单的时序仿真问题
`timescale 1ns / 1ps
module multi(clk,a_in,reset,yout);
parameter WIDTH=2;
input[WIDTH-1:0] a_in;
input clk;
input reset;//高脉冲复位
output[WIDTH-1:0] yout;
reg[WIDTH-1:0] yout;
always@(posedge clk or posedge reset)
begin
if(reset)
yout<=2'd0;
else
yout<=a_in;//将输入直接输出,这就是个时序仿真实验程序,没有具体的意思
end
endmodule
对这个简单的模块进行时序仿真, 工作频率设置为100Mhz,没有加时序和引脚约束,输出结果为:输入保持110ns才有正确的输出。为什么输入要保持这么久才会有正确的输出 ?
testbench如下:
`timescale 1ns / 1ps
module tb_multi_v;
parameter HALF_CLK=5,
WIDTH=2;
// Inputs
reg [WIDTH-1:0] a_in;
reg clk;
reg reset;
// Outputs
wire [WIDTH-1:0] yout;
//creat clk
initial begin
clk=1'b0;
forever
#HALF_CLK clk=~clk;
end
initial begin
// Initialize Inputs
reset=1'b1;
#10;
reset=1'b0;
a_in = 2'b11;
#120 $stop;
end
multi multi (
.a_in(a_in),
.clk(clk),
.reset(reset),
.yout(yout)
);
endmodule
你的 yout怎么还是在下降沿变化的?怎么还有引脚约束?不就在Modelsim中仿真而已吗?
yout在下降沿变化只是个巧合,因为yout是经过延迟后才输出。 这是时序仿真,在耗费资源多和对速度要求高的场合要进行时序约束,但我这没耗费什么资源,速度也就是100Mhz,应该不需要进行约束就能达到100Mhz的要求
这不是简单的RTL仿真么?为什么输出还有延时呢。既然有延时,那会不会是延时的原因
功能仿真的结果正确,一个周期就出来结果
把你的代码仿了一下。没什么问题 一个周期就出结果了
是时序仿真 ,有延迟应该是正常的,现在问题是,输入要保持110ns
你做的是功能仿真吗?功能仿真如你所说
你做时序仿真的对象是什么?应该不是RTL代码了吧?是否已经综合成网表来做的?能把具体的操作说明吗?
1、将RTL代码综合 转换映射 布局 布线 2、将布局布线后的生成网标文件(.v)和testbench以及RTL代码添加到ModelSim中编译,3、布局布线后生成的延时文件(.scf)映射到ModelSim中,4、仿真 glbl(延迟文件)和testbench。最后得到上面的时序仿真结果。我现在发现个新问题,如果,我没隔一个周期输入一个数据,只要第一个数据满足了时序要求,后面的数据都能输出结果。
这个新问题还比较好理解,因为时序是固定不变的嘛,虽然会导致延时,但周期性是不会改变的说,所以第一个满足了,后面的一般都会满足的,仿真的时候也不会出现外部的干扰来影响时序。至于第一个问题为什么保持了110ns才输出,不知道是不是和复位信号在内部的走线有关系,不过延迟几十ns才到寄存器的复位端有点不可思议,真奇怪。要不你修改你的复位信号的验证激励看看?也许复位信号的宽度也会有影响的,而且你可以试试产生一下复位信号的上升沿看看。