2

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

但我尝试将这些端口作为输出端口,但我仍然可以运行它而不会出现任何错误。那么在 Verilog 中 inout 和 output 端口可以互换使用吗?

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

module (clk, rst, cnt, start, width, signal);
  input clk, rst, signal;
  output reg [11:0] cnt, width;
  output reg start;

  always @(posedge clk or negedge rst)
  begin
    if(~rst)
    begin
      cnt <= 0;
      start = 0;
      width <= 'h271;
    end
    else
    begin
      if(signal)
      begin

        width <= (start) ? width : 'h271;
        start = 1;
      end
      cnt <= (start) ? (cnt + 1) : cnt;
    end
  end
endmodule

注意 - 我知道,对于 inout 端口,我需要修改代码,因为 inout 端口不能是 reg 类型。但我在这里只询问端口类型。

4

3 回答 3

4

模拟器不关心端口方向。仿真工具总是使模块层次结构变平,重要的是它们可以将两个端口信号连接在一起。他们不检查数据流是否确实朝着指定的方向流动。不幸的是,标准要求的内容和工具中实现的内容并不总是匹配的。

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

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

于 2015-12-12T18:31:17.397 回答
4

outputinout端口有区别:

  1. 您不能inout同时读取和写入端口,因此保持'Z读取。

  2. inoutport永远不能是 type reg。它必须是wire类型。

  3. 应该有一个信号决定给定端口是一个input还是output

在这个模块中,您必须有一个w_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;

由于inout信号是有线的,它必须由连续的赋值语句驱动。

参考这部分:

那么在 Verilog 中 inout 和 output 端口可以互换使用吗?

答案是不鼓励互换使用它们。由于对于输出端口,您可以reg单独使用类型。

从综合的角度来看,该inout端口可以具有三态驱动器或 Mux,如下所示:(请注意,对于我不确定的综合工具,此结果可能会有所不同。):

双向端口分配

有关详细信息,请参阅双向端口分配双向 I/O 引脚论坛问题。

于 2015-12-12T15:50:40.090 回答
2

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

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

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

于 2015-12-15T09:43:26.620 回答