system verilog $signed使用,以及环境变量设置通过export

日常小结:
2021/8/23
对于$signed做了如下测试,我们已知的是int的signed类型的,logic是unsigned类型的,如果我们想要把unsigned类型的变量转为signed类型的,就要用到这个函数,并且根据测试结果,4bit unsigned类型的logic,变成32bit位宽的int类型,如果加$signed就会自动补足高位为1,即如果我们的4bit有符号数是4’b1111,其实表示的是-1,使用$sign是可以变成32位的int型的-1,参考下面的例子。
所以我们在设计中遇到一些信号如果最高位是表示正负的,uvm的环境中很多时候我们用的是int类型的,我们可以通过这个函数转换一下。

module test_disable();
logic  [3:0]  unsigned_signal1;
logic  [3:0]  signed_signale2;
int           result1;
int           result2;

initial begin

    unsigned_signal1=4'b1111;
    signed_signale2=4'b1111;
    result1=$signed(unsigned_signal1);
    result2=signed_signale2;

    $display("result1 is %d",result1);
    $display("result2 is %d",result2);

    unsigned_signal1=4'b1000;
    signed_signale2=4'b1000;
    result1=$signed(unsigned_signal1);
    result2=signed_signale2;

    $display("result1 is %d",result1);
    $display("result2 is %d",result2);

    unsigned_signal1=4'b0111;
    signed_signale2=4'b0111;
    result1=$signed(unsigned_signal1);
    result2=signed_signale2;

    $display("result1 is %d",result1);
    $display("result2 is %d",result2);


end
endmodule

仿真结果如下
result1 is          -1
result2 is          15
result1 is          -8
result2 is           8
result1 is           7
result2 is           7

相关知识:
四位二进制补码所能表示的十进制整数范围是 -8 至7。

已知一个数的补码,求原码的操作其实就是对该补码再求补码。如果补码的符号位为“0”,表示是一个正数,其原码就是补码。即四位二进制补码0111 = 四位二进制原码0111 = 12^2+ 12^1+ 1*2^0=十进制整数7。

如果补码的符号位为“1”,表示是一个负数,求给定的这个补码的补码就是要求的原码。即四位二进制补码1000符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。其余三位000取反后为111;再加1,所以是1000。负的四位二进制原码-(1000) =-( 1*2^3)=十进制整数-8

补码作用:
补码表示统一了符号位和数值位,使得符号位可以和数值位一起直接参与运算,这也为后面设计乘法器除法器等运算器件提供了极大的方便。

补码概念的引入和当时运算器设计的背景不无关系,从设计者角度,既要考虑表示的数的类型(小数、整数、实数和复数)、数值范围和精确度,又要考虑数据存储和处理所需要的硬件代价。因此,使用补码来表示机器数并得到广泛的应用。

shortint2-state data type, 16-bit signed integer
int2-state data type, 32-bit signed integer
shortint2-state data type, 16-bit signed integer
int2-state data type, 32-bit signed integer
longint2-state data type, 64-bit signed integer
byte2-state data type, 8-bit signed integer or ASCII character
bit2-state data type, user-defined vector size, unsigned
logic4-state data type, user-defined vector size, unsigned
reg4-state data type, user-defined vector size, unsigned
integer4-state data type, 32-bit signed integer
time4-state data type, 64-bit unsigned integer

Makefile相关:
加上@,命令就不打印出来了

TEST=HEIHEI

run:
	@echo ${TEST}

打印结果是
echo HEIHEI
HEIHEI
TEST=HEIHEI

run:
	echo ${TEST}
打印结果是
HEIHEI

filter紧跟着的一堆字符串是集合,只有符合这个集合的才会通过过滤,

TEST=HEIHEI

run:
	@echo ${TEST}

TEST=$(filter hpc1 hcp2 , hcp2 hpc1 hpc3)
打印结果是hpc2 hpc1       

进一步与ifneq联合使用,一般是更改上面定义的变量,并且这个ifneq不是在执行空间run内,直接放在下面就可以,make执行的时候TEST所使用的值是最后被赋值的值

TEST=HEIHEI

run:
	@echo ${TEST}

#TEST=$(filter hpc1 hcp2 , hcp2 hpc1 hpc3)

ifneq ($(filter hpc1 hpc2 ,  hpc2),)
TEST=YAYA
else
TEST=HAHA
endif
打印结果是YAYA

set这个命令时查看所有环境变量

export变量输出,作用就是把某个shell中定义的变量输出,今天遇到的一个问题是在命令行直接
echo $host, 能够打印出hpc1,但是在Makefile中无法识别$host,问题的原因host变量没有输出出来
我是在shell1.csh中定义了host,但是没有使用export输出出来,所以host这个变量只在shell1中起作用,
在Makefile这个脚本中不能识别host,所以${host}为空。
export命令将使系统在创建每一个新得shell时,定义这个变量得一个拷贝。这个过程称之为变量输出

export 功能说明:设置或显示环境变量。
语  法:export [-fnp][变量名称]=[变量设置值]
补充说明:在shell中执行程序时,shell会提供一组环境变量。export可新增,修改或删除环境变量,供后续执行的程序使用。export的效力仅限于该次登陆操作。
参  数:
 -f  代表[变量名称]中为函数名称。
 -n  删除指定的变量。变量实际上并未删除,只是不会输出到后续指令的执行环境中。
 -p  列出所有的shell赋予程序的环境变量。

我们使用system verilog计算除法时候,有时候会使用两个整数相除,这时候即使我们的结果定义成real类型,结果的小数也会直接四舍五入被省略,比如
real result;
int a=3;
result=a/8;
结果result就等于0.0,这时候我们把8,变成8.0,小数就会被保留下来

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值