VHDL是在Generic中使用字符串的有效语法吗?

时间:2015-02-09 15:10:16

标签: vhdl

我已经使用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语法,因此是莱迪思工具的问题吗?或者我的代码样式是否应该更改为不使用字符串作为泛型?

2 个答案:

答案 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;