在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
12
返回列表 发新帖
楼主: redleaf1988

[求助] 求助:后仿,出现点问题,求懂得后仿的大神,给指点讨论,本人在读硕士,水平有限

[复制链接]
 楼主| 发表于 2015-4-27 20:19:42 | 显示全部楼层
本帖最后由 redleaf1988 于 2015-4-27 20:22 编辑

回复 9# huangxjmail
      我花了一下午时间,把master中的状态机,整合一遍,自己想了一些在组合逻辑中,减少延时的方法,把组合逻辑切断,通过用寄存器。具体考虑到我master中的设计,组合逻辑,我在if else 语句的条件中,用的很多,我定义了许多寄存器,但还是组合逻辑,没有打拍子,如果打上拍子,用时序逻辑做,逻辑上的时序就出问题,出不来要的时序。
   
    我是这么做的 ,例如:


          reg nseq_seq_last; always @( state or nseq_seq)
   if( state== LAST | nseq_seq )

   nseq_seq_last = 1'b1;

else

    nseq_seq_last = 1'b0;




reg breq_nseq_seq_last;
always @( state or nseq_seq_last)
   if( state== BREQ | nseq_seq_last )

   breq_nseq_seq_last = 1'b1;

else

    breq_nseq_seq_last = 1'b0;


      我定义了很多这样的寄存器,目的把多个组合逻辑分开算,思想是这样的 ,因为组合逻辑主要在if else条件语句中,如:if(a+b+c)
通过定义: reg a1; 再定义a2:  让a1=a+b; 再算 a1+a2;  一直这么做,将代码中 所有if else 条件判断语句,都这么替换啦,最后后仿真,modelsim
出现

         
          rewrite 后仿真.jpg


# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(103): $hold( posedge CLK:138710 ps, posedge I &&& (in_clk_enable1 != 0):138801 ps, 129 ps );
#    Time: 138801 ps  Iteration: 0  Instance: /tb_top/Top/\m1/write1_reg
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(103): $hold( posedge CLK:208795 ps, posedge I &&& (in_clk_enable1 != 0):208846 ps, 129 ps );
#    Time: 208846 ps  Iteration: 0  Instance: /tb_top/Top/\m1/data_4
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(104): $hold( posedge CLK:228710 ps, negedge I &&& (in_clk_enable1 != 0):228801 ps, 129 ps );
#    Time: 228801 ps  Iteration: 0  Instance: /tb_top/Top/\m1/write1_reg
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(103): $hold( posedge CLK:368710 ps, posedge I &&& (in_clk_enable1 != 0):368801 ps, 129 ps );
#    Time: 368801 ps  Iteration: 0  Instance: /tb_top/Top/\m1/write1_reg
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(104): $hold( posedge CLK:368795 ps, negedge I &&& (in_clk_enable1 != 0):368846 ps, 129 ps );
#    Time: 368846 ps  Iteration: 0  Instance: /tb_top/Top/\m1/data_4
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(103): $hold( posedge CLK:528795 ps, posedge I &&& (in_clk_enable1 != 0):528846 ps, 129 ps );
#    Time: 528846 ps  Iteration: 0  Instance: /tb_top/Top/\m1/data_4
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(104): $hold( posedge CLK:588710 ps, negedge I &&& (in_clk_enable1 != 0):588801 ps, 129 ps );
#    Time: 588801 ps  Iteration: 0  Instance: /tb_top/Top/\m1/write1_reg
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(104): $hold( posedge CLK:688795 ps, negedge I &&& (in_clk_enable1 != 0):688846 ps, 129 ps );
#    Time: 688846 ps  Iteration: 0  Instance: /tb_top/Top/\m1/data_4
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(103): $hold( posedge CLK:758710 ps, posedge I &&& (in_clk_enable1 != 0):758801 ps, 129 ps );
#    Time: 758801 ps  Iteration: 0  Instance: /tb_top/Top/\m1/write1_reg
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(104): $hold( posedge CLK:808710 ps, negedge I &&& (in_clk_enable1 != 0):808801 ps, 129 ps );
#    Time: 808801 ps  Iteration: 0  Instance: /tb_top/Top/\m1/write1_reg
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(103): $hold( posedge CLK:848795 ps, posedge I &&& (in_clk_enable1 != 0):848846 ps, 129 ps );
#    Time: 848846 ps  Iteration: 0  Instance: /tb_top/Top/\m1/data_4
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(103): $hold( posedge CLK:858710 ps, posedge I &&& (in_clk_enable1 != 0):858801 ps, 129 ps );
#    Time: 858801 ps  Iteration: 0  Instance: /tb_top/Top/\m1/write1_reg
# ** Error: D:/Xilinx/14.6/ISE_DS/ISE/verilog/src/simprims/X_FF.v(104): $hold( posedge CLK:948795 ps, negedge I &&& (in_clk_enable1 != 0):948846 ps, 129 ps );
#    Time: 948846 ps  Iteration: 0  Instance: /tb_top/Top/\m1/data_4   


      结合,仿真出的信息,我应该怎么做、?

      大神,结合实际信息,下一步 我应该怎么做?

      后仿真,以前没做过,进行fpga板级验证之前,后仿真得先过的,不知道咋做了
 楼主| 发表于 2015-4-27 20:25:32 | 显示全部楼层
回复 10# stanley015
   书,我也在看,代码时序仿真都出来了,但是作用不大

   我在fpga板级验证之前,必须先做出 后仿真,让后仿真出结果,因为以前后仿真,没做过,所以问题很多。


   结合我发出的,截图和信息,您要是知道怎么做,就帮指点一下吧,我时间比较紧张,谢谢啦
发表于 2015-4-27 22:25:59 | 显示全部楼层
第一,谁告诉你FPGA上板前一定要后仿真? 你的工程占多大的逻辑资源量? 70%+吗? FPGA是应用设计,是你在一个很可靠的硬件平台上做设计,不是IC设计那种从0做起,后仿这种东西,在工程量不大的时候,真的没必要,好的coding style + 合理约束,就可以在行为仿真后,直接上板跑,基本不会出问题。
第二,从你写状态机的代码来看,你的coding style确实不咋样,比如if(state == a | b)这种,我就搞不明白了,state应该是在你写FSM前都设计好了,从IDLE到END,就算是边写边设计,那也应该是一个确定的状态,为何最后还要用一个逻辑运算来得到? 这样的代码不仅会有关键路径,可阅读性也很差。
发表于 2015-4-28 09:12:14 | 显示全部楼层
1、你的代码风格确实有问题,state为状态机的寄存器最好不要参与运算,如上面的代码你可以写为
reg nseq_seq_last;
always @(*)
   if( state)
   nseq_seq_last = 1'b1;
else
    nseq_seq_last = 1'b0;
或者
assign nseq_seq_last = LAST | nseq_seq;(如果能满足功能要求)
2、所谓的把组合逻辑拆开,多打几拍,我举个列子:
assign y=a&b&c&d;
如果y可以多打一拍,或者将y多打一拍也有办法实现想要的功能,那么 可以拆为
always @ (posedge clk)begin
   reg1 <= a&b;
   reg2 <= c&d;
   y <= reg1&reg2;
end
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 05:48 , Processed in 0.026544 second(s), 6 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表