请问Modelsim后仿出错的问题
程序前仿真时序、功能均正确程序较大,系统时钟68M。
后仿(Post-Route)出现问题:很多信号莫名其妙的变成红线,如图1所示,前仿没有这个问题。

看modelsim中有如下错误提示:
# ** Error: C:/Xilinx/12.3/ISE_DS/ISE/verilog/src/simprims/X_FF.v(104): $setup( negedge I &&& (in_clk_enable1 != 0):1284703722 ps, posedge CLK:1284703836 ps, 202 ps );
# Time: 1284703836 ps Iteration: 2 Instance: /test/uut/\TrackMode/int_clr_I_P/data_reg_1T_21仿真图形中也有红色显示,如图2所示。

我在后仿前对最主要的时钟加了时间约束,时钟为68M,约束限制其PERIOD为一个时钟周期以内(14ns)
如图3、图4所示:


ucf文件中的约束信息:
#Created by Constraints Editor (xc3s1400an-fgg676-5) - 2013/05/10
NET "RTM/U1/GClk_BT1" TNM_NET = RTM/U1/GClk_BT1;
TIMESPEC TS_RTM_U1_GClk_BT1 = PERIOD "RTM/U1/GClk_BT1" 14 ns HIGH 50%;
请问这种问题该如何解决?
这个不太懂。
时序违例了。
你把/test/uut/\TrackMode/int_clr_I_P/data_reg_1T_21 这个寄存器的时钟和数据波形拉出来看看,在时钟上升沿的附近,数据肯定发生了变化,违反了setup时间。
为什么会违例呢?语句有问题? 涉及到这个寄存器的语句有以下几条:
reg signed [21:0] data_reg_1T;
reg signed [21:0] DOUT_1T;
reg signed [25:0] data_reg_10T;
reg signed [25:0] DOUT_10T;
……
else if(clr) begin
DOUT_1T <= data_reg_1T + data_reg;
if(cnt==9) begin
DOUT_10T <= data_reg_10T + data_reg_1T + data_reg;
……
end
else begin
……
data_reg_10T <= data_reg_10T + data_reg_1T + data_reg;
end
……
end
setup时间?是指data_reg_1T的setup时间还是时钟信号的setup时间?
你贴的代码好像都是data_reg_1T的输出,你要看data_reg_1T的输入。
把data_reg_1T的时钟、输入、输出都放到波形上,一定有某个时钟上升沿,输入是有值的,但它在接近时钟上升沿时才变化,然后输出就X了。
把波形放大了找到这个点。
谢谢你后仿时间很长,一时半会没出来
data_reg_1T的输入语句如下:
input signed [7:0] DIN;
assign a = DIN;
assign data_reg = ((CODE)?(~a+1):a); //wire signed [7:0] data_reg;
always @(……) begin
……
data_reg_1T <= data_reg_1T + data_reg;
……
end
请问这种写法有明显的问题么?
有人说 assign data_reg = ((CODE)?(~a+1):a); 这句的写法会造成很大的延时,建议我改成always 语句?
这两种语句在时延上有区别么?
input DIN是直接从testbench输入的吗?
是的话,你要看一下testbench加激励的时序。
不能在时钟的上升沿直接加,一定要错开一段时间。
不然带时序仿真就很容易时序违例。
你可以试试跟时钟下降沿对齐加激励。
>>有人说 assign data_reg = ((CODE)?(~a+1):a); 这句的写法会造成很大的延时,建议我改成always 语句?
这个没关系的。
这肯定是setup违例了,你的STA有问题没?
不好意思
菜鸟问一句”STA“是什么?
setup违例是什么意思?如何避免?
谢谢
STA就是静态时序分析。你用Xilinx的的软件也可以做的,这个是检查设计中是否有时序问题的重要手段。一般所有的设计都有这一个步骤的。出现setup违例的情况有很多种解决方法,具体问题具体分析了。
请问问题解决了吗?我的也是一样一样的问题,愁
