后仿真的问题
时间:10-02
整理:3721RD
点击:
# ** Error: d:/Xilinx/13.4/ISE_DS/ISE/verilog/src/simprims/X_RAMB18SDP.v(401): $hold( posedge WRCLK:300130 ps, posedge DI[0] &&& di0_enable:300410 ps, 286 ps );
# Time: 300410 ps Iteration: 1 Instance: /tb_prachframedeinterleave/uut/\frame1de_ram300/U0/xst_blk_mem_generator/gnativebmg.native_blk_mem_gen/valid.cstr/ramloop[0].ram.r/v5_noinit.ram/SDP.WIDE_PRIM18.TDP
这是我后仿真时候modelsim提示出现的错误,明显是保持时间不够,frame1de_ram300是我例化的深度300 进出1bit的 block ram,那么WRCLK是block ram的写时钟 使用的就是系统时钟 di0_enable可能是block ram的使能信号 ena DI[0]可能是block RAM输入数据;
我怀疑是输入block ram的数据保持时间不够,就使用了buff缓冲,进行延时,但是还是出现这个错误啊!
buff缓冲使用的是
module buffer(a,
b);
input a;
output b;
wire b1/*synopsys keep=1*/;
assign b1=a;
assign b = b1;
endmodule
从错误上看 是我的输入数据有错误吗? 还是哪个信号啊? 多谢大虾们指点一下啊 多谢啊
# Time: 300410 ps Iteration: 1 Instance: /tb_prachframedeinterleave/uut/\frame1de_ram300/U0/xst_blk_mem_generator/gnativebmg.native_blk_mem_gen/valid.cstr/ramloop[0].ram.r/v5_noinit.ram/SDP.WIDE_PRIM18.TDP
这是我后仿真时候modelsim提示出现的错误,明显是保持时间不够,frame1de_ram300是我例化的深度300 进出1bit的 block ram,那么WRCLK是block ram的写时钟 使用的就是系统时钟 di0_enable可能是block ram的使能信号 ena DI[0]可能是block RAM输入数据;
我怀疑是输入block ram的数据保持时间不够,就使用了buff缓冲,进行延时,但是还是出现这个错误啊!
buff缓冲使用的是
module buffer(a,
b);
input a;
output b;
wire b1/*synopsys keep=1*/;
assign b1=a;
assign b = b1;
endmodule
从错误上看 是我的输入数据有错误吗? 还是哪个信号啊? 多谢大虾们指点一下啊 多谢啊
你的buffer怎么没有时钟啊,如果没有时钟,buffer就没有作用了
你看看发生hold violation的时间,300ns左右,这时候设计应该还没有开始工作,很可能是clock或data上发生了从x到0/1的跳变,这个hold应该不用管,除非影响到了整个仿真,如果影响到了,可以分析以下是否可以不在意这个时刻的状态,如果可以就force一下。
还有,你在设计里面例化了一个buf,这个buf会在综合之后被优化掉的,除非你用什么命令让他keep住
一般来说,对于单时钟域,用altera\Xilinx\CME等的FPGA综合出来的网表做后仿,不会出现hold的violation。
hold一般会出现在多时钟域设计中跨时钟域的地方。
