【问题标题】:Instantiate VHDL in Verilog with generics containing std_logic使用包含 std_logic 的泛型在 Verilog 中实例化 VHDL
【发布时间】:2015-08-26 05:55:18
【问题描述】:

我希望替换 Verilog 模块 (for this reason) 中的一些通用同步器代码。代码是一个标准的 2-flop 同步器。

always @ (posedge clk_i or posedge rst)
begin
  if (rst)
    begin
      rx_sync_tmp <= 1'b1;
      rx_sync     <= 1'b1;
    end
  else
    begin
      rx_sync_tmp <= rx_i;
      rx_sync     <= rx_sync_tmp;
    end
end

VHDL 中的实体声明也很简单:

entity synchroniser_d_flip_flop_n is

    generic(
        NUM_STAGES          : natural   := 2;
        RESET_ACTIVE_STATE  : std_logic := '1';
        DEFAULT_AFTER_RESET : std_logic := '0'
    );

    port(
        clk_i       : in  std_logic;
        reset_i     : in  std_logic; 
      d_i           : in  std_logic;
        q_o         : out std_logic
    );

end synchroniser_d_flip_flop_n;

但是,如果我尝试以明显的方式在 verilog 中实例化它:

synchroniser_d_flip_flop_n #(2, 1, 1) rx_sync_block(
    clk_i,
    rst, 
    rx_i,
    rx_sync
    );

Altera Quartus-II 15.0.2 给出以下错误(目标是 MAX10):

Error (10517): VHDL type mismatch error at synchroniser_d_flip_flop.vhd(9): std_logic type does not match integer literal
Error (10517): VHDL type mismatch error at synchroniser_d_flip_flop.vhd(10): std_logic type does not match integer literal

也就是说,它似乎不接受 1 作为 std_logic。

Xilinx seems to suggest 无法在 Verilog 中实例化包含 std_logic 的 VHDL 泛型:

泛型(参数)映射遵循 VHDL 泛型类型(及其 支持 Verilog 等效项)。

 integer
 real
 string
 boolean

注意在混合语言边界上发现的任何其他泛型类型都是 认为是一个错误。


tl;博士

是否有一种标准方法可以在 Verilog 文件中实例化包含 std_logic 的 VHDL 泛型?如果没有,建议的解决方法是什么?

【问题讨论】:

  • 尝试使用布尔值而不是整数创建您的 Verilog,其中您有一个位信号。您的工具很可能可以将布尔值转换为 std_logic 并返回,但我并不惊讶它拒绝整数。
  • 你不能用1'b11'b0 而不是用1,它代表一个整数吗?
  • @Rusell 评论使它对我有用。我接受了更完整的答案,因为它讨论了标准化。

标签: generics vhdl verilog


【解决方案1】:

没有标准 - 您必须检查您的模拟器文档。 Cadence 文档说“Verilog 整数参数的 LSB 映射到单位 std_logic 泛型”。相关表相当无益地指的是 SV,但我很确定这也适用于普通的 Verilog。

MoldelSim/QuestaSim 文档说,如果“泛型类型为 bit、bit_vector、integer、real、std_logic、std_logic_vector、vl_logic、vl_logic_vector、时间、物理、枚举,您可以在 Verilog 或 SV 中实例化 VHDL 设计单元,或字符串”。

isim 一直有点像火车残骸 - 他们还在 Vivado 中使用它吗?如果你坚持使用它,我会重写 VHDL 以采用整数泛型。

【讨论】:

    【解决方案2】:

    试试这个:

    synchroniser_d_flip_flop_n #(2, 4'd3, 4'd3) rx_sync_block(
        clk_i,
        rst, 
        rx_i,
        rx_sync
        );
    

    std_logic 可以采用 9 个枚举值中的任何一个:{U,X,0,1,Z,W,L,H,-} 因此,对于 4'd3,您指定了此列表中的第三个值。对于逻辑 0,您将选择 4'd2

    【讨论】:

    • 嘿,我知道这是你的第一个答案。不能说任何关于内容的事情,但你可以考虑在你的内联代码周围使用backticks(`your-inline-code-here`),并为整行代码制作代码块(缩进四个空格),使您的答案更具可读性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    相关资源
    最近更新 更多