VHDL - 根据通用参数声明条件属性

3

我该如何编写一个代码段,以评估一个通用类型,并相应地创建(或不创建)属性?

示例:

if G_MY_GENERIC then
    attribute my_attribute_typ : string;
    attribute my_attribute_typ of signal_having_an_attr : signal is "value";
else
    --nothing is created
end if;
4个回答

4

相反,你必须使用以下方式来有条件地设置属性(虽然繁琐但可以达到效果):

  signal asvRam : svRam_at(0 to gc_nFifoDepth-1) := (others => (others => '0'));

  type svStr_at is array(boolean) of string(0 to 10);
  constant c_svRamStyle : svStr_at := (false => "           ", true => "distributed");
  attribute ram_style : string;
  attribute ram_style of asvRam : signal is c_svRamStyle(gc_bDistributedRam);

这比被接受的答案好多了,因为它不限制属性的范围。它至少可以在Vivado中工作。 - Tey'
作为另一个答案的作者,我同意。 - OllieB

4

完全可以编写类似的代码,但该属性仅在生成语句的范围内可见。

g_something: if test_condition generate
   attribute my_attribute_typ : string;
   attribute an_attribute of my_attribute_typ: signal is "value";
begin
    -- attribute is visible in this scope

    p_my_process: process(clk)
    begin
        -- attribute is also visible here
    end process;
end generate;

-- but not here

2
我们在IEEE VHDL工作组中讨论了更一般化的条件编译。争论激烈。有些人希望采用编译时方法(类似于'C'),而有些人则希望采用扩展时方法。在'C'中,编译时方法很有效,因为常量也是编译时对象。然而,在VHDL中,编译时方法将无法理解VHDL环境中的事物,因此,使用通用型是不可行的。另一方面,编译时方法可能会给出供应商名称、工具类型(模拟器、综合器等)等信息。
我已将您的代码添加到提案页面中。它位于:http://www.eda.org/twiki/bin/view.cgi/P1076/ConditionalCompilation 如果您愿意分享有关您的应用程序的其他见解,我也想将其添加到提案中。

我希望根据所使用的技术声明不同的RAM样式属性名称。Altera使用“ramstyle”,而Xilinx使用“ram_style”。此外,我的请求将允许为每个属性设置不同的默认值。 - Passepartout
哦,我稍微修改了我的示例,你应该看一下。 - Passepartout

-2

基本上:这正是 VHDL 不起作用的方式。在 VHDL 中,您声明要使用特定硬件位,然后综合器尝试连接这些硬件位。任何动态创建硬件的迹象,例如 for ... generate 循环,本质上只是一种外观:语法糖可以减轻痛苦。

您可以有条件地对信号/变量进行赋值:

process (sig1, sig2, enable) is
begin
  if enable = '1'
  then
    out <= sig1;
  else
    out <= sig2;
  end if;
end process;

这并没有什么帮助。VHDL是一种图灵完备的编程语言。诚然,将其用作此类语言非常痛苦,并且几乎仅用于硬件规格说明,但这并不改变您可以将其用于更多用途的事实,只要您不期望综合工具对您的程序做任何事情。 - OllieB
1
@Ollie...你可能会惊讶于现代合成工具在VHDL的“编程”风格方面表现得非常出色。当然,存在一些限制-静态循环边界-但例如,可以使用过程和函数来简化复杂的状态机,并进行良好的综合。我发现我可以将一块(适当的)C或Ada代码转码为VHDL,并对其进行综合。然后,具有讽刺意味的是,艺术在于从并行的VHDL代码中提取串行性(将其转换为状态机),以使硬件尺寸保持不变... - user1818839

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接