我一直在试图找到使用Xilinx SystemC指定给Verilog核心的整数的绝对值,我所看到的是Verilog将负数视为正数。
我尝试了所有的数据类型:signed int
, int
, Xuint32
。
我的SystemC或Xilinx C代码是:
signed int data,value;
data=-20;value=0;
putfsl(data,0);
getfsl(value,0);
signed int data1,value1;
data=20;value=0;
putfsl(data1,0);
getfsl(value1,0);
得到变量的值后,我在超级终端上打印它们。
在我的Verilog端代码是:
out <=(in<0)?-in:in;
我也尝试了这个代码,但结果相似
if(in<0)
out=-in;
else
out=in;
请帮帮我!
我也尝试过其他数据类型和改变参数,但结果并不是我总是得到的与我输入的数字相同,即
in<0
语句不正确,我也尝试了in<=0;
我无法帮助系统C,但根据您的评论Verilog代码正在使用信号in
的无符号类型。
reg [31:0] in;
if(in<0) //This will always be false since reg is unsigned
out=-in;
else
out=in;
为了使其工作,必须将in
声明为已签名。
signed reg [31:0] in;
您仍然可以通过查看MSB来测试负数的无符号值(假设in
实际上保存了两个补码值)。
//If negative
if(in[31])
out = -in;
else
out = in;
好吧,我终于找到了答案,真的是有人建议的。感谢他(马丁·汤普森)
答案是:在Verilog-2001之前,Verilog中的所有向量运算都是无符号的。
在Verilog-2001中,你可以显式地调用有符号算术,所以我认为你需要转换你的In:
if ($signed(in) < 0)
out = -$signed(in);
else
out = in;
你可能感兴趣的读物: