VHDL 在通用中使用字符串是有效的语法吗?
VHDL is it valid syntax to use string in Generic?
我使用 Xilinx 工具有一段时间了,它们非常适合以下代码:
ENTITY Example IS
GENERIC(
g_Mode : STRING := "Normal"); -- "Normal", "Test"
PORT(
Clk : IN STD_LOGIC;
-- ETC
);
END Example;
ARCHITECTURE rtl OF Example IS
Normal_g : IF g_Mode = "Normal" GENERATE
-- Normal Operation Code Here
END GENERATE Normal_g;
Test_g : IF g_Mode = "Test" GENERATE
-- Test Operation Code Here
END GENERATE Test_g;
但是我最近改用 Lattice Tools,第二次检查 g_Mode 时出现错误。错误是 "Comparison between unequal length arrays always returns FALSE"。所以看起来两个生成语句之一永远不会执行。我的问题是,这种合法的 VHDL 语法是否是 Lattice Tools 的问题?还是我的代码风格应该更改为不使用字符串作为泛型?
使用字符串作为泛型是合法的。但是看看实际的错误信息:非常清楚。
一种解决方案是使所有字符串的长度相同。 Test_g : IF g_Mode = "Testxx" GENERATE
应按预期编译和工作。
一个更好的解决方案——因为字符串比较在这里没有增加任何实际价值——可能是在包中声明一个枚举类型 type Mode is (Normal, Test, Special);
,并使你的泛型类型为 Mode。 (这也避免了例如拼写错误的事故)
或者如果只有两种模式,则将泛型设为布尔值 Testing
。那么正常情况就变成了if not Testing generate...
是的,有效。
示例:
在较新的 IP 核和基元中,Xilinx 将泛型类型更改为字符串,因为它与 Verilog 有共同点,并且避免了 Vivado 类型和泛型处理中的几个错误。
要抑制不相等的字符串比较警告,您可以这样声明一个函数:
function str_equal(str1 : STRING; str2 : STRING) return BOOLEAN is
begin
if str1'length /= str2'length then
return FALSE;
else
return (str1 = str2);
end if;
end function;
我使用 Xilinx 工具有一段时间了,它们非常适合以下代码:
ENTITY Example IS
GENERIC(
g_Mode : STRING := "Normal"); -- "Normal", "Test"
PORT(
Clk : IN STD_LOGIC;
-- ETC
);
END Example;
ARCHITECTURE rtl OF Example IS
Normal_g : IF g_Mode = "Normal" GENERATE
-- Normal Operation Code Here
END GENERATE Normal_g;
Test_g : IF g_Mode = "Test" GENERATE
-- Test Operation Code Here
END GENERATE Test_g;
但是我最近改用 Lattice Tools,第二次检查 g_Mode 时出现错误。错误是 "Comparison between unequal length arrays always returns FALSE"。所以看起来两个生成语句之一永远不会执行。我的问题是,这种合法的 VHDL 语法是否是 Lattice Tools 的问题?还是我的代码风格应该更改为不使用字符串作为泛型?
使用字符串作为泛型是合法的。但是看看实际的错误信息:非常清楚。
一种解决方案是使所有字符串的长度相同。 Test_g : IF g_Mode = "Testxx" GENERATE
应按预期编译和工作。
一个更好的解决方案——因为字符串比较在这里没有增加任何实际价值——可能是在包中声明一个枚举类型 type Mode is (Normal, Test, Special);
,并使你的泛型类型为 Mode。 (这也避免了例如拼写错误的事故)
或者如果只有两种模式,则将泛型设为布尔值 Testing
。那么正常情况就变成了if not Testing generate...
是的,有效。
示例:
在较新的 IP 核和基元中,Xilinx 将泛型类型更改为字符串,因为它与 Verilog 有共同点,并且避免了 Vivado 类型和泛型处理中的几个错误。
要抑制不相等的字符串比较警告,您可以这样声明一个函数:
function str_equal(str1 : STRING; str2 : STRING) return BOOLEAN is
begin
if str1'length /= str2'length then
return FALSE;
else
return (str1 = str2);
end if;
end function;