日常小结:
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
补码作用:
补码表示统一了符号位和数值位,使得符号位可以和数值位一起直接参与运算,这也为后面设计乘法器除法器等运算器件提供了极大的方便。
补码概念的引入和当时运算器设计的背景不无关系,从设计者角度,既要考虑表示的数的类型(小数、整数、实数和复数)、数值范围和精确度,又要考虑数据存储和处理所需要的硬件代价。因此,使用补码来表示机器数并得到广泛的应用。
shortint | 2-state data type, 16-bit signed integer |
---|---|
int | 2-state data type, 32-bit signed integer |
shortint | 2-state data type, 16-bit signed integer |
int | 2-state data type, 32-bit signed integer |
longint | 2-state data type, 64-bit signed integer |
byte | 2-state data type, 8-bit signed integer or ASCII character |
bit | 2-state data type, user-defined vector size, unsigned |
logic | 4-state data type, user-defined vector size, unsigned |
reg | 4-state data type, user-defined vector size, unsigned |
integer | 4-state data type, 32-bit signed integer |
time | 4-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,小数就会被保留下来