【发布时间】:2018-08-11 09:04:12
【问题描述】:
我正在使用 active-hdl 来模拟我的 FPGA 设计,我想知道是否可以使用动态生成的字符串来表示我在模拟器中的信号。例如,假设我有一个包含操作码的 4 位 std_logic_vector,我希望模拟器显示操作码字符串“nop”、“add”、“sub”等,而不是向量值。
我一开始尝试声明自定义枚举类型,但很快发现您无法选择单个元素的值。我的下一个解决方案是仅将枚举用于模拟显示并使用翻译函数进行转换:
type op_code_type is (nop, add, sub, unknown); -- not in order
signal op_code_str: op_code_type;
signal op_code: std_logic_vector(3 downto 0);
function to_string(op_code : std_logic_vector(3 downto 0))
return op_code_type is
begin
case op_code is
when "0000" => return nop;
when "0010" => return add;
when "0011" => return sub;
when others => return unknown;
end case;
end to_string;
begin
----- testbench -----
process
begin
op_code <= "0000";
wait for 1ns;
op_code <= "0001";
wait for 1ns;
op_code <= "0010";
wait for 1ns;
op_code <= "0011";
wait for 1ns;
end process;
op_code_str <= to_string(op_code);
end architecture;
这实际上效果很好,对于我想做的大多数事情来说可能已经足够了:
但主要问题是我被字符串常量困住了,所以对于像mov acc,x 这样更复杂的东西以及现实世界设计中的所有其他变体来说,这太不切实际了。
有没有办法像这样构造动态模拟标识符?还是 HDL 的基本限制?
【问题讨论】:
-
有可能。您当前的思维方式的问题是,您所说的“字符串”不是字符串,而是枚举类型。此类型仅限于定义的值。您可以尝试使用多个函数构造一个(连接的)字符串。但是,您应该记住 vhdl 不支持具有动态长度的数组对象。
-
Active-HDL 将通过枚举文字(例如
nop)显示枚举类型的对象(例如信号)。您可以使用属性'val和'pos将枚举文字转换为整数,反之亦然。您还可以使用'image和'value将这些文字转换为字符串,反之亦然。一般来说,您应该将操作码建模为枚举而不是 std_logic_vector。 -
GTKWave 可以使用翻译过滤器、文件中的表格或外部进程(对反汇编程序有用)。用编程语言解决仪表问题。在 VHDL 中获取可变长度字符串的方法是使用访问类型和分配器(例如 textio),并且不会通过没有固定长度字符串对象(静态声明)的波形转储文件传达字符串值。
-
枚举类型 'LEFT 的标量位置值为 0。为标量值的二进制范围提供所有枚举是确定性的。
type op_code_type is (nop, unk1, add, sub, unk4, unk5, unk6, unk7, unk8, unk9, unk10, unk11, unk12, unk13, unk14, unk15);op_code_type'IMAGE(op_code_type'VAL(to_integer(unsigned(op_code))))访问的字符串值。注意有三种不同的字符串长度。 -
我不确定是否使用 SignalTap,但是在定义类型时使用 ModelSim,例如枚举 CPU 正在经历的状态(即 FETCH、DECODE...),是能够向您显示状态的名称,而不是符合状态的位。
标签: vhdl fpga lattice-diamond active-hdl