Verilog 为什么我不能将值输入到inout类型? 我从这个电路创建了这个代码 这是错误图像 该电路是具有3态输出的四总线收发器

Verilog 为什么我不能将值输入到inout类型? 我从这个电路创建了这个代码 这是错误图像 该电路是具有3态输出的四总线收发器,verilog,system-verilog,xilinx,xilinx-ise,Verilog,System Verilog,Xilinx,Xilinx Ise,Verilog代码 module Q52QuadrupleBus3Stlate(GAB,GBA,A,B); inout [3:0] A,B; input GAB,GBA; reg winA,winB; assign B = (GAB==1&&GBA==0) ? winA : 4'hz; assign A = (GAB==0&&GBA==1) ? winB : 4'hz; always @ (GAB or GBA)

Verilog代码

module Q52QuadrupleBus3Stlate(GAB,GBA,A,B);
    inout [3:0] A,B;
    input GAB,GBA;
    reg winA,winB;
    assign  B = (GAB==1&&GBA==0) ? winA : 4'hz;
    assign  A = (GAB==0&&GBA==1) ? winB : 4'hz;
    always @ (GAB or GBA)
    begin
        winA <= A;
        winB <= B;
    end
endmodule
在Verilog中:

  • wire
    必须由实例化模块或
    assign
    语句的
    output
    (或
    inout
    )驱动

  • reg
    必须由
    始终
    初始
    块驱动

决定信号是reg还是导线主要取决于驱动信号的代码类型。您的信号
A
B
由实例化模块(
uut
)的输出和
初始
块驱动。所以,你有一个两难选择。幸运的是,有一个简单的解决方案,通常在Verilog中使用

要从
初始块
始终
块驱动
inout
,除了连接到模块
inout
端口的导线之外,还需要一些额外的信号(
A
B
)。您需要一个
reg
来对应以下各项:

reg  [3:0] Ain;
reg  [3:0] Bin;
reg        Aen;
reg        Ben;
以及使能信号,以对应于每个:

reg  [3:0] Ain;
reg  [3:0] Bin;
reg        Aen;
reg        Ben;
然后需要使用
assign
语句实现一些三态驱动程序:

assign A = Aen ? Ain : 'bz;
assign B = Ben ? Bin : 'bz;
您需要从
initial
块驱动
reg
s,而不是从
wire
s:

        Ain = 0; Bin = 0;
最后,您还需要驱动来自同一
初始
块的启用信号:

        Aen = 1; Ben = 1;
以下是完整的代码:

`timescale 1ps / 1ps
module Q52TestBench;
    reg GAB;
    reg GBA;
    // Bidirs
    wire [3:0] A;
    wire [3:0] B;
    reg  [3:0] Ain;
    reg  [3:0] Bin;
    reg        Aen;
    reg        Ben;
    parameter step = 10000;
    Q52QuadrupleBus3Stlate uut (GAB,GBA,A,B);
    assign A = Aen ? Ain : 'bz;
    assign B = Ben ? Bin : 'bz;
    initial begin
            GAB = 0;
            GBA = 0;
            Ain = 0; Bin = 0;
            Aen = 1; Ben = 1;
    #step GAB = 1;
    #step GBA = 0;
    #step GAB = 0;
    #step GBA = 1;
    #step GAB = 1;
    #step GBA = 0;
    #step GAB = 0;
    #step GBA = 1;
    #(step*10) $finish;
    end
endmodule

不能从程序块驱动导线。您需要类似于:
reg A1;分配一个=(某个条件)?A1:'hz并从程序块驱动
A1
。非常感谢。verilog太难了。