универсальные параметры vhdl, используемые другими универсальными параметрами (ошибка: универсальный «параметр» здесь не отображается) - PullRequest
0 голосов
/ 02 мая 2019

В Verilog я могу определить параметр, а затем использовать его для определения другого параметра. Например:

module stuff1 #(
   parameter AW = 16,
   parameter DW = 16,
   parameter FW = AW + DW + 2,
) (
    input   wire [AW-1:0]     adr,
    input   wire [DW-1:0]     dat,
    output  wire [FW-1:0]     fifo
);
endmodule

Как я могу сделать что-то похожее в VHDL generic? Пример:

library ieee;
use ieee.std_logic_1164.all;

entity stuff1 is
    generic(
        AW          : integer := 15;
        DW          : integer := 15;
        FW          : integer := AW + DW + 2
    );
    port(
        adr   : in    std_logic_vector(AW-1 downto 0);
        dat   : in    std_logic_vector(DW-1 downto 0);
        fifo  : out   std_logic_vector(FW-1 downto 0)
    );
end entity;

architecture rtl of stuff1 is
begin

end architecture;

Когда я пытаюсь скомпилировать этот код, я получаю следующую ошибку в VHDL:

..\..\simtools\ghdl\bin\ghdl.exe -a bus_direct_server.vhdl
stuff1.vhdl: generic "aw" is not visible here
stuff1.vhdl: generic "dw" is not visible here

Мне интересно, возможно ли в VHDL автоматически вычислять параметр FW из AW и DW? или Верилог был более притягателен в этом случае?

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

Почему просто ты не делаешь это как:

library ieee;
use ieee.std_logic_1164.all;

entity stuff1 is
    generic(
        AW          : integer := 15;
        DW          : integer := 15;
    );
    port(
        adr   : in    std_logic_vector(AW-1 downto 0);
        dat   : in    std_logic_vector(DW-1 downto 0);
        fifo  : out   std_logic_vector(AW+DW+1 downto 0)
    );
end entity;

architecture rtl of stuff1 is
begin

end architecture;

Я предполагаю, что существует связь между входным и выходным векторами, которую вы хотите сохранить. Кажется плохой практикой иметь общие параметры с зависимостями от других.

0 голосов
/ 03 мая 2019

Я не знаю, пройдёт ли трюк синтез, но он работает в симуляторе GHDL.Сначала создайте пакет с функцией для вычисления fw из параметров aw и dw:

library ieee;
use ieee.std_logic_1164.all;

package pkg_stuff1 is
    function fw_calc (aw: natural; dw: natural) return natural;
end package;

package body bus_direct is

    function fw_calc (aw: natural; dw: natural) return natural is
    begin
        return dw + aw + 2;
    end function;

end package body;

После того, как мы установим пакет, нужно его использовать:

library ieee;
use ieee.std_logic_1164.all;
using work.pkg_stuff1.all;

entity stuff1 is
    generic(
        AW          : integer := 15;
        DW          : integer := 15
    );
    port(
        adr   : in    std_logic_vector(AW-1 downto 0);
        dat   : in    std_logic_vector(DW-1 downto 0);
        fifo  : out   std_logic_vector(fw_calc(aw, dw)-1 downto 0)
    );
end entity;

architecture rtl of stuff1 is
begin

end architecture;
...