如何在verilog中为双向端口赋值?

电器工程 验证日志 高密度脂蛋白
2022-01-28 00:49:42

我正在尝试在 Verilog 中使用双向端口,以便可以通过它发送和接收数据。我的问题是,当我尝试为任务中的端口分配值时,我不断收到错误消息。

为这些类型的变量赋值的正确方法是什么?

我的代码如下:

    module test(value,var);

    inout value;
    output var;
    reg var,value;

    task sendValue;
      begin
        var = 1;
        value = 1;
      end
    endtask

   endmodule

我得到的错误是:

错误:C:/[...]: (vlog-2110) 非法引用净“价值”。

谢谢。

3个回答

如果您必须使用任何端口作为 inout,请记住以下几点:

  1. 您不能同时读取和写入 inout 端口,因此保持 highZ 以供读取。
  2. inout 端口永远不能是 reg 类型。
  3. 应该有一个条件,它应该被写入。(当 Write = 1 时应该写入 mem 中的数据,并且在 Write = 0 时应该能够读取)。

例如,我将按照以下方式编写您的代码。

module test (value, var);
  inout value;
  output reg var;

  assign value = (condition) ? <some value / expression> : 'bz;

  always @(<event>)
    var = value;

endmodule

顺便说一句,当 var 是 wire 类型时,您可以按以下方式阅读它:

assign var = (different condition than writing) ? value : [something else];

因此,如您所见,没有限制如何读取它,但输入端口必须按照上面显示的方式写入。

我希望这能向你解释。

检查您使用的库是否包含任何三态驱动程序 - 它们是我在这种情况下一直使用的。

如果您被迫尝试设计自己的三态驱动程序,请记住,只要它允许输入,它的输出就必须是 Z。

这是我的2美分,

wire [32-1:0] DATA;//bidireccional port in VERILOG/VHDL
logic put_input_in_bidi;

assign m_sram_if.SRAM_DATA_READ = DATA;//read from inout port
assign DATA = (put_input_in_bidi==1'b1)? m_sram_if.SRAM_DATA_WRITE : 32'hZZZZ_ZZZZ;//write in bidi iout port
assign put_input_in_bidi =     (blabla == 0)  &&  (bobbob == 1);//control write in bidi using master information
其它你可能感兴趣的问题