VHDL-将字符串转换为32位整数



我有一个文本文件,其中包含计算的预期输出和一个vhdl测试台,该测试台带有进行计算的测试模块。这个想法是用文件中的预期输出来计算模块的输出。

该模块在32位上工作,文件包含最大32位的整数值列表(逐行(。问题是,我写了一段代码,在模块的每个输出和文件的每个输出之间进行比较,但这给了我一个奇怪的错误。

代码是这样的:


process

variable line_v : line;
file read_file : text;
variable read_int : integer;
variable read_string: string(1 to 10); --Max integer on 32 bit is 4294967295: 10 chars
begin

file_open(read_file, "mat2.mem", read_mode);
for i in 0 to 31 loop
for j in 0 to 31 loop
readline(read_file, line_v);
read(line_v, read_string);

row <= std_logic_vector(TO_UNSIGNED(i, row'length));
col <= std_logic_vector(TO_UNSIGNED(j, col'length));
wait for 2 ns; -- after 2 ns, I have the result available on 32 bit std_logic_vector "data"

assert unsigned(data) = integer'value(read_string) report "ERROR! Result not equal to expected one!";

end loop;
end loop;
file_close(read_file);
end process;

我收到的错误是这个(根据模拟器,数据包含3413424693(:

错误:值字符串"3413424693";无法解释为整数类型

我该如何解决这个问题?

谢谢

如何解决此问题

正如您从评论和其他答案中看到的,VHDL中没有定义32位无符号整数值范围。如果有的话,它将是依赖于供应商实现的,并且是不可移植的。不需要等待具有64位范围整数的-2019实现(到目前为止,-2008还没有完整的实现(,就值得探索其他选项。

似乎有两种基本的解决方法。使用可以读取长度为32的std_logic_vvector(或无符号值(或以较小增量处理整数值的读取过程。读取过程解决方案来自Synopsys软件包std_logic_textio或-2008 IEEE软件包numeric_std(未签名(或软件包std_logic_1164(std_logic_vvector(。这些要求读取的值是位字符串文字或1和0的字符串(而不是抽象文字(。

可以演示一种处理较小整数的方法。这里的想法是用两个较小的值将整数值转换为无符号,这里是十进制数字,并以无符号的形式进行所有计算。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
package dec_conv is
function dec2slv(s: string; l: positive := 32) return std_logic_vector;
end package dec_conv;
package body dec_conv is
function dec2slv(s: string; l: positive := 32) return std_logic_vector is
variable decade:    positive := 1;
variable result:   unsigned (l - 1 downto 0) := (others => '0');
begin
for i in s'reverse_range loop
result := result + resize (
(to_unsigned(natural'value("" & s(i)), l) * decade)
, l);
decade := decade * 10;
end loop;
return std_logic_vector(result);
end function;
end package body;
library ieee;
use ieee.std_logic_1164.all;
use work.dec_conv.all;
entity dec2slv_tst is
end entity;
architecture foo of dec2slv_tst is
signal data:    std_logic_vector (31 downto 0) := x"cb74ba35";
begin
assert data = dec2slv("3413424693")
report "ERROR"
severity ERROR;
end architecture;

函数可以从由表示数值0-9的字符组成的任何长度字符串中生成任何长度的std_logic_vector。请注意,没有检查来确定两者的指定长度。如果两者兼容,可能会产生错误。长度由具有默认值的CCD_ 1指定(这使得在函数调用中指定是可选的(。它可以处理由长度为32的向量中的所有"1"表示的最大无符号整数值4294967295。

reverse_range的使用从LS数字开始。注意,这里可以使用字符串输入值的别名来确保s具有上升范围(类型字符串具有延迟范围(。别名可以指定子类型指示,并始终提供一个上升范围,用于代替子程序主体中的s。resize函数调用是取的乘积的较低l长度乘积,并将其分配给result。CCD_ 6被用作从右到左的每个数字的权重值。

使用此方法的执行工作量大致相当于使用读取位字符串文字(在-2008中可以是十进制(的读取过程。

如果您查看std.standard包,您将看到:

type INTEGER is range -2147483647 to 2147483647;

3413424693大于2147483647。这就是你的错误。基本上,这个评论不是真的:

--Max integer on 32 bit is 4294967295

应该是:

--Max integer on 32 bit is 2147483647

最新更新