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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6215|回复: 25

[求助] 请问一个verilog 的case statement的非常奇怪的问题

[复制链接]
发表于 2013-4-1 12:25:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 hancheng1166 于 2013-4-2 00:58 编辑

鄙人最近正在研究mips processor.用verilog写,之前一直在用vhdl的,但是最近发现一个问题,下面我贴一下代码




  1. always @(*)
  2.         begin
  3.                 casex({aluop_ex, funct})
  4.                         6'b000??? : alu_ctrl <= 0000;
  5.                         6'b010000 : alu_ctrl <= 0000;
  6.                         6'b010001 : alu_ctrl <= 0001;
  7.                         6'b010010 : alu_ctrl <= 0010;
  8.                         6'b010011 : alu_ctrl <= 0011;
  9.                         6'b010100 : alu_ctrl <= 0100;
  10.                         6'b010101 : alu_ctrl <= 0101;
  11.                         6'b010110 : alu_ctrl <= 0110;
  12.                         6'b010111 : alu_ctrl <= 0111;
  13.                         6'b011000 : alu_ctrl <= 1000;
  14.                         6'b011001 : alu_ctrl <= 1001;
  15.                         6'b100??? : alu_ctrl <= 1010;
  16.                         6'b110??? : alu_ctrl <= 1011;
  17.                         6'b111??? : alu_ctrl <= 1100;
  18.                         default          : alu_ctrl <= 1111;
  19.                 endcase
  20.         end


复制代码


下面是testbench....我在每个延迟10ns的时候控制aluop_ex跟funct的输入的值,就是上面case语句从上到下的值。然后在仿真结果上得到相应的时间也就是alu_ctrl前面的数字,同时得到alu_ctrl的值。



  1. initial begin
  2.                 // Initialize Inputs
  3.                 funct = 0;
  4.                 aluop_ex = 0;
  5.                 #10
  6.                 funct = 0;
  7.                 aluop_ex = 2;
  8.                 #10
  9.                 funct = 1;
  10.                 aluop_ex = 2;
  11.                 #10
  12.                 funct = 2;
  13.                 aluop_ex = 2;
  14.                 #10
  15.                 funct = 3;
  16.                 aluop_ex = 2;
  17.                 #10
  18.                 funct = 4;
  19.                 aluop_ex = 2;
  20.                 #10
  21.                 funct = 5;
  22.                 aluop_ex = 2;
  23.                 #10
  24.                 funct = 6;
  25.                 aluop_ex = 2;
  26.                 #10
  27.                 funct = 7;
  28.                 aluop_ex = 2;
  29.                 #10
  30.                 funct = 0;
  31.                 aluop_ex = 3;
  32.                 #10
  33.                 funct = 3;
  34.                 aluop_ex = 4;
  35.                 #10
  36.                 funct = 1;
  37.                 aluop_ex = 5;
  38.                 #10
  39.                 funct = 2;
  40.                 aluop_ex = 6;
  41.                 #10
  42.                 funct = 0;
  43.                 aluop_ex = 7;
  44.                 // Wait 100 ns for global reset to finish
  45.                 #700;
  46.        $stop;
  47.                 // Add stimulus here

  48.         end
  49.         
  50.         initial begin
  51.                
  52.                         $monitor($time, "alu_ctrl=%b", alu_ctrl);
  53.         end
  54.       


复制代码

下面是结果,我用Isim 仿真的:





  1.                    0alu_ctrl=0000
  2.                   20alu_ctrl=0001
  3.                   30alu_ctrl=1010
  4.                   40alu_ctrl=1011
  5.                   50alu_ctrl=0100
  6.                   60alu_ctrl=0101
  7.                   70alu_ctrl=1110
  8.                   80alu_ctrl=1111
  9.                   90alu_ctrl=1000
  10.                  100alu_ctrl=0010
  11.                  110alu_ctrl=0111
  12.                  120alu_ctrl=0011
  13.                  130alu_ctrl=1100


复制代码


奇怪的结果我用bolder 标识出来了。
但结果应该是:
30alu_ctrl=0010
40alu_ctrl=0011
70alu_ctrl=0110
80alu_ctrl=0111

我用别的simulator 也试过了,比如iverilog结果是一样的。一开始我以为是Bug的问题,但现在觉得可能是我语句哪里有不对的地方、
有知道的大神请指点一下~~
非常感谢~!
发表于 2013-4-1 14:39:08 | 显示全部楼层
您实在是写的太不清楚了

aluop_ex 和 funct 各是几位?

“30alu_ctrl=0010” 又是啥意思?
 楼主| 发表于 2013-4-1 22:19:25 | 显示全部楼层
本帖最后由 hancheng1166 于 2013-4-1 22:21 编辑

回复 2# glk47


   不好意思,aluop_ex跟funct各是3位,然后alu_ctrl前面的数字指的是时间比如前面的30指的是第30ns
发表于 2013-4-1 22:28:10 | 显示全部楼层
这个是随aluop_ex跟funct的值变化的,而不是时间。ps:我也是菜鸟 仅供参考
 楼主| 发表于 2013-4-1 22:33:37 | 显示全部楼层
回复 4# 小小舟


   我可能没说清楚,我没有贴出我testbench~我在testbench上面控制哪一个时间输入aluop_ex跟funct的值,然后在这一时间 就会输出对应的aluctrl。
发表于 2013-4-1 22:54:29 | 显示全部楼层
回复 5# hancheng1166


    要不你把testbench也贴出来吧?
发表于 2013-4-1 22:58:24 | 显示全部楼层
组合逻辑电路为什么要用非阻塞赋值语句呢
 楼主| 发表于 2013-4-2 00:49:12 | 显示全部楼层
回复 6# 小小舟


   你好,testbench已经在上面编辑出来了
 楼主| 发表于 2013-4-2 00:50:42 | 显示全部楼层
本帖最后由 hancheng1166 于 2013-4-2 00:53 编辑

回复 7# flyingsheep


   即使不用非阻塞幅值结果也是一样的
 楼主| 发表于 2013-4-2 09:06:25 | 显示全部楼层
本帖最后由 hancheng1166 于 2013-4-2 09:07 编辑

回复 10# chen851112


   不用了,跟你解释我代码的时间我已经处理完了。

           anyway, thx for your time.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-2 14:14 , Processed in 0.031479 second(s), 8 queries , Gzip On, Redis On.

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