Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VHDL在泛型中使用字符串是否有效?_Vhdl - Fatal编程技术网

VHDL在泛型中使用字符串是否有效?

VHDL在泛型中使用字符串是否有效?,vhdl,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"

我使用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工具,第二次检查g_模式时出现了一个错误。错误是,“不等长数组之间的比较总是返回FALSE”。因此,似乎两条generate语句中的一条永远不会执行。我的问题是,这是否是合法的VHDL语法,因此也是晶格工具的问题?或者我的代码样式应该改变为不使用字符串作为泛型吗?

使用字符串作为泛型是合法的。然而,看看实际的错误消息:它非常清楚

一种解决方案是使所有字符串的长度相同<代码>测试:如果g_Mode=“Testxx”GENERATE应按预期编译和工作

一个更好的解决方案-因为字符串比较在这里不添加实际值-可能是声明枚举类型
类型模式为(正常、测试、特殊)并使您的泛型类型为Mode。(例如,这也避免了拼写错误的事故)

或者,如果只有两种模式,则将泛型设置为一个称为
测试的布尔值。然后,如果不测试生成…,则正常情况变为
是,它是有效的

示例:
在较新的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;

可以对默认的
“=”[string,string return boolean]
运算符进行重载,以使用正常语法抑制错误。@Kevin:您是对的;不过,这是假设晶格工具正确处理重载。他们可能仍然只是简单地报告一个错误…一个关于长度不等的错误或警告?它的添加反映了复合类型的相等定义。(IEEE标准1076-2008 9.2.3关系运算符,第4段)。Xilinx的HDL编译器将返回类似的消息作为警告,经过合理分析(5.3.2.2索引约束和离散范围,b))后可以忽略该消息。更改泛型常量的值并更改其长度。如果这是一个错误,这是晶格的问题,可以根据Paebbels/Kevin和Brian的答案解决。LRM没有把它定义为错误。@David:是的,我说错了,只是把它当作错误来接受。尽管这并不重要:如果Lattice错误地不接受它,他确实需要一个解决方法。我在@Brian上投票给了你的答案,它很优雅(5.2.2.1,枚举文本只需是唯一的,它们有一个关联的值)。该评论旨在澄清问题。谢谢你们的回答。我确实需要一个变通办法,但我的问题实际上并不一定是在寻找。我更好奇的是,VHDL是否合法地允许语法本身,David说LRM没有将其定义为错误。我向Lattice support提交了一张罚单,所以他们是否想改变这种行为取决于他们。感谢Brian的解决方案。我只想向阅读本文的其他人指出,上面示例中的语法在技术上是VHDL允许的。我已经向莱迪思提交了一份关于此行为的支持通知单。非常适合报告。值得用结果更新问题。。。(显然,我不允许在评论的开头说“+1”。)