verilog中的integer和reg的差别

integer类型也是一种寄存器数据类型,integer类型的变量为有符号数,而reg类型的变量则为无符号数,除非特别声明为有符号数,还有就是integer的位宽为宿主机的字的位数,但最小为32位,用integer的变量都可以用reg定义,只是对于用于计数更方便而已。reg,integer,real,time都是寄存器数据类型,定义在Verilog中用来保存数值的变量,和实际的硬件电路中的寄存器有区别




今天看代码时遇到了integer,只知道这是个整数类型,可详细的内容却一窍不通,查看了资料---《verilog数字VLSI设计教程》。其中是这么写到的:

大多数的矢量类型(reg或者net)都被默认当做无符号数。integer和real是个例外,它们被默认为当做有符号数。通常,real类型是不可综合的。

假设在没有溢出的情况下,不管是无符号数还是有符号数,它们都是二进制的一串数值而已;而当这个值被当做某种类型比较时:又符号数的MSB被用来表示这个数字的符号,而无符号数的MSB则是位权最高的那一位。无论采用什么样的二进制格式,一个无符号数永远也不能成为负值。

下面是一个和符号位有关的例子:

1
2
3
4
5
6
7
8
9
10
11
12
reg[31:0] A;
integer I;
...
A=-1;
I=-1; //both A and I hold 32'hffffffff
//
if (I>32'h0)
     $display( "I is positive." )
else  $display( "I is not positive" ); //Prints "I is not positive"
if (A>32'h0)
     $display( "A is positive" ); //Prints "A is positive"
else  $display( "I is not positive" );

我用类似的方式在quartus II 中进行了仿真,但得到的结果都是A,这可以看出Q2在比较过程中将integer简单得看为无符号的数据,并没有像代码中所说的结果一样。但感觉书本中写的其实挺有道理的,难道是软件的不同,所以得到的结果不同??

先抛出这个问题吧,有机会下次再去验证一下。

更新部分:

上次验证没成功,今天已验证居然成功了,上次肯定是哪弄错了,现在把代码和图贴上:

1
  
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
module integer_reg(clk,negA,negI);
input clk;
  wire[31:0]A;
integer I;
output reg negA;
output reg negI;
assign A=-3;
always @(posedge clk)
     begin
     
     I=-3;
     if (A<0)
        negA<=1;
        else  negA<=0;
      if (I<0)
         negI<=1;
         else  negI<=0;
         end
      
endmodule

未命名1

对于关系算符,综合会有不同的结果,这取决于被比较的是有符号还是无符号数,会综合出无符号关系算符,或又符合关系算符.

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值