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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4680|回复: 7

[求助] DC逻辑综合求助

[复制链接]
发表于 2014-11-25 10:30:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 onearangel 于 2014-11-25 15:26 编辑

希望各位大神给点建议(已解决)
部分代码如下:
always@(posedge clk or posedge rst) begin
        if(rst) begin     
            fetch1 = 0;
            fetch2 = 0;
            fetch3 = 0;
            add1 = 0;
            add2 = 0;
            and1 = 0;
            and2 = 0;
            jmp = 0;
            mov = 0;            
        end
        case(counter_out)
           0:begin    //fetch the first beat
                fetch1 = 1;
                fetch2 = 0;
                fetch3 = 0;
                add1 = 0;
                add2 = 0;
                and1 = 0;
                and2 = 0;
                jmp = 0;
                mov = 0;
            end
           ......
      endcase
end
用DC逻辑综合时报以下错误(42行就是always块开始的地方):
Error:  /home/onear/digitalIC/simplecpu/code/cu.v:42: The statements in this 'always' block are outside the scope of the synthesis policy. Only an 'if' statement is allowed at the top level in this always block. (ELAB-302)
*** Presto compilation terminated with 1 errors. ***
发表于 2014-11-25 13:19:30 | 显示全部楼层
1. 用<=不用=;
2. if begin end后加else。
发表于 2014-11-25 15:03:37 | 显示全部楼层
回复 1# onearangel

always@(posedge clk or posedge rst) begin
         if(rst) begin     
             fetch1 = 0;
             fetch2 = 0;
             fetch3 = 0;
             add1 = 0;
             add2 = 0;
             and1 = 0;
             and2 = 0;
             jmp = 0;
             mov = 0;            
         end
      else  begin      
case(counter_out)
            0:begin    //fetch the first beat
                 fetch1 = 1;
                 fetch2 = 0;
                 fetch3 = 0;
                 add1 = 0;
                 add2 = 0;
                 and1 = 0;
                 and2 = 0;
                 jmp = 0;
                 mov = 0;
             end
            ......
       endcase
end

end

if(rst ) begin ... end里是异步复位;
后面的else begin ... end里是时钟clk上升沿处理的逻辑;

如楼上所说,不建议在电路中使用=,如果对它的运用不熟练的话;

另外,上面的case ... endcase可以放在always外面,而寄存器的赋值在always里面。

上面的代码,感觉要实现一个简单的指令译码和执行。
 楼主| 发表于 2014-11-25 15:24:11 | 显示全部楼层
回复 2# iamr


    在case前加了else问题就解决了。多谢!
发表于 2014-11-25 22:21:28 | 显示全部楼层
我感觉楼主应该感谢一下3楼、他说的挺有道理的、
 楼主| 发表于 2014-11-26 07:51:58 | 显示全部楼层
回复 3# mymemory


    说的很有道理,谢谢。不过在这个设计中,如果将阻塞赋值改为非阻塞赋值,对逻辑功能会有一定的影响。
发表于 2014-11-26 11:10:58 | 显示全部楼层
回复 4# onearangel


  你这样子加else,逻辑就不是原来的逻辑了,要想好了
 楼主| 发表于 2014-11-26 12:01:51 | 显示全部楼层
回复 7# my2817


    我用modelsim仿真了下,和之前的逻辑一样,没有变化。还是非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

X

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

GMT+8, 2025-6-24 06:16 , Processed in 0.022014 second(s), 9 queries , Gzip On, MemCached On.

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