【问题标题】:VHDL generic comparison and synthesisVHDL泛型比较与综合
【发布时间】:2017-03-24 14:04:54
【问题描述】:

使用泛型合成代码时遇到问题: 我的实体是:

entity MyEntity is
  generic(
  OUTWIDTH : integer range 8 to 64;
  NBREG : integer range 2 to 8);
  port(
    port1 ....
    port2 ....
  );  
end entity;

architecture rtl of MyEntity is
constant KEEP_VAL : std_logic_vector(OUTWIDTH/8-1 downto 0) := (others=>'1'); -- used to compare my signal with (others=>'1')
signal keep : std_logic_vector((NBREG*OUTWIDTH/8)-1 downto 0);

begin

process(clk)
variable v1 : integer range 0 to NBREG-1
begin
if(rising_edge(clk)) then
   --SOME CODE
   ....
   ....
   -- The comparison I want to do :
  if(keep((v1+1)*(OUTWIDTH/8)-1 downto v1*(OUTWIDTH/8)) = KEEP_VAL) then  -- the line where the error appears
       -- DO sthg
end if;
end process;
end rtl;

要恢复,我想知道具有通用宽度 (OUTWIDTH) 的信号的所有位是否都是“1”。前面的代码在模拟中运行良好,但不想被合成。 为 Libero 合成: @E: CD289 : 期待常量表达式

我假设我可以用一个函数来做到这一点(每个位上的 for 循环并与 '1' 进行比较)但是还有其他“直接”选项吗?

谢谢。

【问题讨论】:

  • 如果您编辑问题以显示与您的错误相关的行会很有帮助
  • 错误与比较行相关(if条件)

标签: generics comparison vhdl synthesis


【解决方案1】:

某些合成器无法使用非常量值来指示切片的范围。您可以做的一件事(几件事)是将您的数组映射到一个二维数组并使用您的非常量索引来访问您想要的内容,而无需任何特殊切片。

type keep_sliced_type is array(natural range <>) of std_logic_vector(outwidth/8-1 downto 0);
signal keep_sliced : keep_sliced_type(0 to nbreg-1);

...

g_map : for i in 0 to nbreg-1 generate
begin
    keep_sliced(i) <= keep(i*outwidth/8+outwidth/8-1 downto i*outwidth/8); --range is composed entirely of constants
end generate;

...

    if keep_sliced(v1)=keep_val then --replaces your erroring line

此外,使用变量通常不是一个好主意,但我不会在这里深入探讨。公平警告,我刚刚在答案框中写了这段代码。它可能有轻微的语法错误。

【讨论】:

    【解决方案2】:

    尽管minimal complete verifiable example不支持你的问题,因此很难正确地帮助你,我可以做一个假设。

    首先:编写正确模拟但不会合成的 VHDL 非常容易。您必须专门为综合编写 VHDL。

    合成器给出的问题可能是由变量v1 引起的。合成这条线有点困难:

    if(keep((v1+1)*(OUTWIDTH/8)-1 downto v1*(OUTWIDTH/8)) = KEEP_VAL)
    

    这一行结合了变量(=异步)算术(例如v1*(OUTWIDTH/8) 与多路复用器和比较操作。您希望如何在逻辑中实现?先多路复用,然后比较?所有比较然后选择正确的结果?

    可能最好将操作分开:实现一个多路复用器(使用信号进行选择,而不是变量)和比较器。

    【讨论】:

    • 一般来说,综合不支持由运行时变化量指定的范围。
    • 你是对的,我虽然问题是关于 KEEP_VAL 常量,但它是关于 keep 变量。我改变了流程来修复它。
    • @scary_jeff 我曾经为桶形移位器编写了各种实现,并将它们与 XST 和 Vivado 合成以测试这样的行为。使用非恒定范围的那个在 XST 中合成得很好,但在 Vivado 中产生了类似的错误。
    • @QuantumRipple 是的,我对 Vivado 有相同的体验,但不支持与 ISE 相同的功能。实际上,我已经与 Xilinx 进行了一些讨论。他们改进了一些东西,而不是全部。
    • 变量不是异步的(这是时钟行为和时序分析的术语)。变量不是静态的。如果我是对的,切片操作需要静态表达式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    相关资源
    最近更新 更多