代码之家  ›  专栏  ›  技术社区  ›  Viktorinox

驱动模块输入

  •  1
  • Viktorinox  · 技术社区  · 7 年前

    我在一些EDA操场上做了一些测试,以检查当模块中的一些输入被驱动时,模拟器工具正在报告什么。

    https://www.edaplayground.com/x/5qK4

    因此,从我的实验来看,工具报告错误的唯一方法是在定义输入时使用var关键字。

    有人能解释一下为什么这三种不同的输入声明方式是不同的吗?

    我猜这意味着在声明为wire时可以执行端口强制

    module test(
      input var logic a,
      input logic b,
      input c
    );
    
    assign a = 1'b0;
    assign b = 1'b0;
    assign c = 1'b0;
    
    endmodule
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Matthew Taylor    7 年前

    这是逻辑类型的输入变量:

     input var logic a,
    

    IEEE 1800-2012第23.2.2.3节规定 var wire ):

    如果省略端口类型:对于输入和输入输出端口,端口 应默认为默认网络类型的网络。可以使用默认的网络类型

    因此,因为默认 default_nettype ,这是一个输入 电线 类型 logic

    input logic b,
    

    如果省略数据类型,则默认为逻辑,但 没有数据类型的互连端口

    因此,这是一个输入 电线 类型 逻辑 :

    input c
    

    assign a = 1'b0;
    

    因为输入 a 绝对是一个变量-这是明确的。但如果我们把它改成

    always_comb a = 1'b0;
    

    那么它仍然是不好的,因为输入被认为是驱动变量 A. 使用 assign 而且,我们已经知道,如果变量已经从其他地方驱动,那么从assign语句驱动它是非法的。

    但是,因为 b c 网是(那种)吗 电线 ),可以从多个地方开车,所以 应该是 好 啊:

    assign b = 1'b0;
    assign c = 1'b0;
    

    *没有一个项目因为打字太长而迟到。因此,为什么不这样做呢?