【问题标题】:Can a verilog module be instantiated in a VHDL module using entity instantiation?可以使用实体实例化在 VHDL 模块中实例化 Verilog 模块吗?
【发布时间】:2018-01-09 16:22:00
【问题描述】:

是否可以使用 VHDL 样式实体实例化在 VHDL 设计中包含 Verilog 模块?

我意识到如果我将 Verilog 模块视为一个组件并实例化该组件,我可以做到这一点。

谢谢

【问题讨论】:

  • 好的,您能否提供一个示例代码,说明您如何将 Verilog 模块视为组件并实例化该组件?你想问一个可以回答的问题,而不是有人提供他们的意见。提供一些代码并解释你做了什么以及你得到了什么错误。另请阅读:stackoverflow.com/help/how-to-ask
  • 提及您感兴趣的工具会很有用...有些工具可能无法提供与其他工具相同级别的支持。
  • 组件声明允许将具有兼容层的目标文件链接(详细)到设计模型中,而具有非可选保留字 entity 的组件实例化将要求模块先前分析(编译)成 VHDL 资源库(IEEE Std 1076-2008 11.7 组件实例化)。 Verilog 模块不是 VHDL 库单元(13. 设计单元及其分析)。设计库是之前分析的设计单元的实现定义存储设施(13.2 设计库,另请参见 13.5 分析顺序)。
  • 查看 cmets 中的讨论并给出以下答案:您应该澄清您的问题。

标签: vhdl verilog


【解决方案1】:

从我的代码集中获取:

module sync_fifo
#(parameter WIDTH    = 8, // width in bits
            L2DEPTH  = 4, // Log 2 Depth, 4=16 deep
            REGFLAGS = 1  // Full, empty are registered
)
(
   input                   clk,     // system clock                 
   input                   reset_n, // A-synchronous low reset/clear
   input                   enable,  // clock gating                 
   input                   clear,   // Synchronous clear            

   input                   write,   // write FIFO                   
   input       [WIDTH-1:0] wdata,   // write data                   
   input                   read,    // read FIFO                    
   output      [WIDTH-1:0] rdata,   // read data                    

   output reg              empty,   // FIFO is empty                
   output reg              full,    // FIFO is full                 
   output reg      [L2DEPTH:0] level    // Fill level                   
);

outp_fifo : sync_fifo 
generic map(
   WIDTH   => 10,  -- Byte + user + last
   L2DEPTH => 7,   -- 128 deep
   REGFLAGS=> 1
  )
port map 
(
   clk     => ACLK,                  -- system clock                 
   reset_n => ARESETN,               -- A-synchronous low reset/clear
   enable  => BIT_1 ,                -- clock gating                 
   clear   => BIT_0 ,                -- Synchronous clear            

   write   => package_byte_en,       -- write FIFO                   
   wdata   => outp_fifo_wt_data_and_meta , -- write data                   
   read    => outp_fifo_read   ,     -- read FIFO                    
   rdata   => outp_fifo_rd_data_and_meta ,     -- read data                    
   empty   => outp_fifo_empty,       -- FIFO is empty                
   full    => outp_fifo_full,        -- FIFO is full                 
   level   => open                   -- Fill level      
   );

后期编辑:
你只能通过有能力的声明来做到这一点:

COMPONENT sync_fifo IS
  generic(
     WIDTH    : integer := 8;
     L2DEPTH  : integer := 8;
     REGFLAGS : integer := 1
  );
  PORT (
       clk    : in STD_LOGIC;         -- system clock                 
       reset_n: in STD_LOGIC;         -- A-synchronous low reset/clear
       enable : in STD_LOGIC;         -- clock gating                 
       clear  : in STD_LOGIC;         -- Synchronous clear            

       write  : in  STD_LOGIC;        -- write FIFO                   
       wdata  : in  STD_LOGIC_VECTOR(WIDTH-1 downto 0); -- write data                   
       read   : in  STD_LOGIC;        -- read FIFO                    
       rdata  : out STD_LOGIC_VECTOR(WIDTH-1 downto 0); -- read data                    

       empty  : out STD_LOGIC; -- FIFO is empty                
       full   : out STD_LOGIC; -- FIFO is full                 
       level   : out STD_LOGIC_VECTOR(L2DEPTH downto 0)  -- Fill level                   
    );
END COMPONENT;

【讨论】:

  • 我不认为这就是他所说的“实体样式声明”。使用您显示的代码,您仍然需要 VHDL 中的组件声明。他可能指的只是声明outp_fifo : entity work.sync_fifo [...]
  • 你不能那样做。 VHDL 是紧身衣语言,因此它需要知道要连接到什么。
  • ^ 这可能就是他问题的答案。不是你在答案中写的;)
  • 啊,谢谢指正。所以问题应该是:“我可以在不使用组件声明的情况下在 VHDL 中实例化 Verilog 模块吗?”引用巴贝奇的话:“我无法正确理解会引发这样一个问题的那种混乱的想法。”
  • 非常感谢大家。看来我的问题的答案确实是“不,你不能”。此外,我会牢记关于提出更好的问题的建议。
【解决方案2】:

虽然 3 年前当有人问这个问题时,答案似乎是“不”,但我在实践中发现答案是“是的,你可以”,但有一些警告。我使用 Mentor ModelSim 和 Xilinx Vivado 确认了这一点。

我不知道 LRM 是否有所改变,或者工具供应商是否决定支持它。我使用的是 VHDL-2008,所以我怀疑是后者。

这是我的一个测试文件中的一个实例。 VerFlopX 是一个 Verilog 模块。

  VerFlopX8c: entity work.VerFlopX (rtl)
    generic map (SIZE => 8)  --integer:=1
    port map (
      Clk => Clk,                --in  wire
      D   => D16(15 downto 8) ,  --in  wire[(SIZE-1):0]
      Q   => Q16(15 downto 8));  --out wire[(SIZE-1):0]

注意事项:

  • 请注意,指定了体系结构“rtl”。这可以(并且可能应该)被省略。但它仍然有效,这似乎很奇怪,因为 Verilog 模块没有架构。
  • 您不能将 Q 输出与打开相关联。 ModelSim 将返回错误。如果您更改为组件实例化,将正式输出连接到 open 就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多