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

Rus*_*ell 4 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;
Run Code Online (Sandbox Code Playgroud)

但是我最近切换到使用莱迪思工具,第二次检查g_Mode时出现错误.错误是,"不等长度数组之间的比较总是返回FALSE".所以似乎两个生成语句中的一个永远不会执行.我的问题是,这是合法的VHDL语法,因此莱迪思工具存在问题吗?或者我的代码样式是否应该更改为不使用字符串作为泛型?

Bri*_*ond 8

使用字符串作为泛型是合法的.但是请查看实际的错误消息:它非常清楚.

一种解决方案是使所有字符串具有相同的长度.Test_g : IF g_Mode = "Testxx" GENERATE应按预期编译和工作.

一个更好的解决方案 - 因为字符串比较在这里没有增加真正的价值 - 可能是type Mode is (Normal, Test, Special);在包中声明一个枚举类型,并使你的通用类型为Mode.(这也避免了例如错误拼写的事故)

或者,如果只有两种模式,则将泛型称为布尔值Testing.那么正常情况就变成了if not Testing generate...