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;