当有时inout和输出端口可以在Verilog中互换使用时,inout端口的确切标准是什么?
在下面的模块中,理想情况下,cnt、width和start应该是输入输出端口,而不是输出端口 但我尝试将这些端口用作输出端口,但我仍然能够毫无错误地运行它。那么,在Verilog中inout和output端口可以互换使用吗 如果否,那么必须使用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) 开
模块(时钟、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;