当有时inout和输出端口可以在Verilog中互换使用时,inout端口的确切标准是什么?

当有时inout和输出端口可以在Verilog中互换使用时,inout端口的确切标准是什么?,verilog,fpga,system-verilog,asic,Verilog,Fpga,System Verilog,Asic,在下面的模块中,理想情况下,cnt、width和start应该是输入输出端口,而不是输出端口 但我尝试将这些端口用作输出端口,但我仍然能够毫无错误地运行它。那么,在Verilog中inout和output端口可以互换使用吗 如果否,那么必须使用inout端口的确切标准是什么(在这种情况下不能使用输出端口) 模块(时钟、rst、cnt、启动、宽度、信号); 输入时钟、rst、信号; 输出寄存器[11:0]cnt,宽度; 输出寄存器启动; 始终@(posedge clk或negedge rst) 开

在下面的模块中,理想情况下,cnt、width和start应该是输入输出端口,而不是输出端口

但我尝试将这些端口用作输出端口,但我仍然能够毫无错误地运行它。那么,在Verilog中inout和output端口可以互换使用吗

如果否,那么必须使用inout端口的确切标准是什么(在这种情况下不能使用输出端口)

模块(时钟、rst、cnt、启动、宽度、信号);
输入时钟、rst、信号;
输出寄存器[11:0]cnt,宽度;
输出寄存器启动;
始终@(posedge clk或negedge rst)
开始
如果(~rst)
开始

cnt在
输出
输入
端口上存在差异:

  • 您不能同时读取和写入
    inout
    端口,因此保留
    'Z
    用于读取

  • inout
    端口可以是
    reg
    类型。它必须是
    wire
    类型

  • 应该有一个信号决定给定端口是
    输入
    还是
    输出

  • 在此模块中,您必须有一个
    w\u r
    信号,其功能如下:

    // w_r = 1 => output port
    // w_r = 0 => input port
    input w_r;    
    inout cnt;    
    reg write_cnt;    
    reg read_cnt;    
    // wire read_cnt;    
    assign cnt = w_r ? write_cnt : 1'bz;    // driving logic for cnt
    
    // inside some always block
    read_cnt <= cnt;
    write_cnt <= some_data;
    
    //w_r=1=>输出端口
    //w_r=0=>输入端口
    输入w_r;
    inout-cnt;
    注册写入;
    注册阅读;
    //线读取;
    分配cnt=w\u r?写入:1'bz;//碳纳米管的驱动逻辑
    //在一些总是阻塞的内部
    
    read_cnt模拟器不关心端口方向。仿真工具总是使模块层次结构变得平坦,重要的是它们可以将两个端口信号连接在一起。它们不会检查数据流是否确实朝指定的方向流动。不幸的是,标准所要求的和工具中实现的并不总是匹配的

    有时,用户的代码在一个工具中“起作用”,但在另一个工具中不起作用,具有更强的错误检查能力。用户发现,让他们的工具供应商删除错误检查比返回并修复代码更容易。一些most模拟器已删除任何检查以强制端口方向


    关于不声明inout端口使用的变量数据类型的规则基本上保持不变,但许多工具允许将常量连接到inout端口

    端口方向在Verilog中基本上是建议性的,在SystemVerilog中这一点没有改变。这是一个历史isue,与Verilog XL(第一个Verilog模拟器)如何导致端口崩溃有关;基本上,一切都是输入输出。在编写'95 LRM时,基本上记录了这种现有行为。在1364-2005年中,这在12.3.8中显示为

    声明为输入(输出)但用作输出(输入)或inout的端口可能被强制为inout。如果不是 被强制输入时,必须发出警告


    实际上,每件事都会以inout
    结束,您可能会收到警告,也可能不会收到警告。所以,在模拟器中几乎可以做任何事情,但linter或合成器应该可以为您拾取任何逻辑连接错误(如果没有,那就没用了)。以下章节中还有其他特定的非方向性规则-
    input
    inout
    端口必须是
    net
    类型,等等。

    这意味着,两者确实可以互换使用(尽管不推荐)?如果没有,那么具体的标准是什么,在哪里必须使用inout端口?(因为如上面代码所示,在“cnt”中,理想情况下应该使用inout端口,但它与“output”端口配合使用效果很好)如果您在任何地方都要使用inout,那么它将处理大量额外的硬件和控制信号。在这段代码中,cnt不是inout,它只是一个reg或一组触发器。在设计中,当start不存在时,cnt保持一个值,如果start存在,则增加保持的值。因此,它可能仅用作输出端口。就我实际所见,在实现I2C(SDA)之类的协议时,需要inout端口。inout的使用可能还有很多其他地方。因此,上述代码中的端口方向不会影响模拟,但会影响合成结果(意味着“输出”cnt和“inout”cnt的合成结果可能不同)?可能不会在合成中编译。因此,在上述代码中,可以使用输出端口,而不是inout。所以你们能给我一些标准吗,在哪里必须使用inout端口?这对于SystemVerilog是不正确的。由于变量的连续赋值规则以及
    uwire
    nettype,您必须选择正确的方向,否则会出现多驱动程序错误。
    // w_r = 1 => output port
    // w_r = 0 => input port
    input w_r;    
    inout cnt;    
    reg write_cnt;    
    reg read_cnt;    
    // wire read_cnt;    
    assign cnt = w_r ? write_cnt : 1'bz;    // driving logic for cnt
    
    // inside some always block
    read_cnt <= cnt;
    write_cnt <= some_data;