我已经使用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;
但是我最近转而使用莱迪思工具,第二次检查g_Mode时出现错误。错误是,"不等长数组之间的比较总是返回FALSE"。所以似乎两个生成语句中的一个永远不会执行。我的问题是,这是合法的VHDL语法,因此是莱迪思工具的问题吗?或者我的代码样式是否应该更改为不使用字符串作为泛型?
答案 0 :(得分:8)
将字符串用于泛型是合法的。但是请查看实际的错误消息:非常清楚。
一种解决方案是使所有字符串长度相同。 Test_g : IF g_Mode = "Testxx" GENERATE
应按预期编译和工作。
更好的解决方案 - 因为字符串比较在这里没有增加任何实际价值 - 可能是在包中声明枚举类型type Mode is (Normal, Test, Special);
,并使您的类型为通用类型。 (这也避免了例如错误拼写的事故)
或者如果只有两种模式,则将泛型设为一个名为Testing
的布尔值。然后正常情况变为if not Testing generate...
答案 1 :(得分:2)
是的,它有效。
例:
在较新的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;