Почему я не могу ввести значение в тип inout?

  • Я создаю этот код из этой схемы Изображение здесь
  • И это изображение ошибки Изображение здесь
  • Эта схема представляет собой приемопередатчики с четырьмя шинами и выходами с 3 состояниями.

Код 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

person Scott Thanarak    schedule 06.09.2016    source источник
comment
Нельзя вбивать провода из процедурных блоков. Вам нужно что-то вроде: reg A1; assign A = (some_condition) ? A1 : 'hz; и диск A1 из процедурного блока.   -  person sharvil111    schedule 06.09.2016
comment
Большое спасибо. Верилог такой сложный.   -  person Scott Thanarak    schedule 07.09.2016


Ответы (1)


В Верилоге:

  • wire должен управляться output (или inout) экземпляра модуля или оператором assign

  • reg должен управляться блоком always или initial.

Решение о том, должен ли сигнал быть регулярным или проводным, зависит в первую очередь от того, какой код управляет сигналом. Ваши сигналы A и B управляются как выходом созданного модуля (uut), так и блоком initial. Итак, перед вами дилемма. К счастью, для этого есть простое решение, которое обычно используется в Verilog.

Чтобы управлять inout от блока initial или always, вам потребуются дополнительные сигналы в дополнение к проводам, подключенным к портам inout вашего модуля (в вашем случае 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;

Вам нужно управлять regs из блока initial, а не wires:

        Ain = 0; Bin = 0;

и, наконец, вам также нужно управлять сигналами включения из того же блока initial:

        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

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

person Matthew Taylor    schedule 06.09.2016