为什么我无法输入inout类型的值?

时间:2016-09-06 08:29:14

标签: verilog system-verilog xilinx xilinx-ise

  • 我从这个curcuit Image Here
  • 创建了这段代码
  • 这是错误图片Image Here
  • 这款电路是具有三态输出的四路总线收发器

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

测试台

`timescale 1ps / 1ps
module Q52TestBench;
    reg GAB;
    reg GBA;
    // Bidirs
    wire [3:0] A;
    wire [3:0] B;
    parameter step = 10000;
    Q52QuadrupleBus3Stlate uut (GAB,GBA,A,B);
    initial begin
            GAB = 0;
            GBA = 0;
            A = 0; B = 0;
    #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

1 个答案:

答案 0 :(得分:1)

在Verilog中:

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

  • reg必须由alwaysinitial块驱动。

关于信号是寄存器还是电线的决定主要由驱动信号的代码类型驱动。您的信号AB由实例化模块(uut)的输出和initial块驱动。所以,你有一个两难的境地。幸运的是,有一个简单的解决方案,这在Verilog中很常用。

要从inoutinitial块中驱动always,除了连接到模块inout端口的电线外,还需要一些额外的信号({{1在你的情况下}和A。您需要B与每个对应:

reg

和一个与每个对应的启用信号:

reg  [3:0] Ain;
reg  [3:0] Bin;

然后,您需要使用reg Aen; reg Ben; 语句实现一些三态驱动程序:

assign

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

wire

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

initial

这是完整的代码:

        Aen = 1; Ben = 1;

https://www.edaplayground.com/x/5biz