Незаконное подключение к выходному или входному порту - PullRequest
0 голосов
/ 12 июля 2020

Итак, это мой тестовый стенд.

module testbench;
wire clk;
reg A, B, C, D;
sequential_module sequential_module(.A(A), .B(B), .C(C), .D(D), .clk(clk));
initial
    begin
        $display("Simulating output for Half Subtractor");
        $monitor($time,,," A=%b B=%b C=%b D=%b clk=%b" , A,B,C,D,clk);
        A=1'b0;C=1'b0;D=1'b0; 
        //#1 A=1'b1;B=1'b0;C=1'b0;D=1'b1; 
        //#1 A=1'b1;B=1'b1;C=1'b1;D=1'b0;
        //#2 $finish;
    end
endmodule

Это мой модуль

module sequential_module(A, B, C, D, clk);
input clk;
output A, B, C, D;
reg A, B, C, D;

always @(posedge clk)
begin
   A = B;    //blocking statement 1
   B = A;    //blocking statement 2
end

always @(posedge clk)
begin
   C <= D;   //non-blocking statement 1
   D <= C;   //non-blocking statement 2
end

endmodule

Код довольно простой c, но я все еще не могу решить эту проблему.

Ошибка (для всех 4 портов): «Ошибка (подавляемая): (vsim-3053) Недопустимый вывод или подключение порта inout для порта 'A'»

1 Ответ

0 голосов
/ 14 июля 2020

Вы пытаетесь установить переменные, которые управляются выводом другого модуля. Вы не можете сделать это в Verilog (или SystemVerilog). Кроме того, Verilog позволяет подключать выходы только к проводам . Если вы просто экспериментируете, вы можете использовать для этого иерархические ссылки.

module testbench;
wire clk;
wire A, B, C, D;
sequential_module s_m(.A(A), .B(B), .C(C), .D(D), .clk(clk));
initial
    begin
        $display("Simulating output for Half Subtractor");
        $monitor($time,,," A=%b B=%b C=%b D=%b clk=%b" , A,B,C,D,clk);
        s_m.A=1'b0;s_m.C=1'b0;s_m.D=1'b0; 
        //#1 A=1'b1;B=1'b0;C=1'b0;D=1'b1; 
        //#1 A=1'b1;B=1'b1;C=1'b1;D=1'b0;
        //#2 $finish;
    end
endmodule

Но реальное оборудование не имеет иерархических ссылок; все должно быть подключено через порты. Вам придется добавить еще один набор из 4 входов плюс еще один сигнал ЗАГРУЗКИ.

module sequential_module(output reg A, B, C, D, input wire clk,
                         input wire Ain, Bin, Cin, Din, LOAD);
always @(posedge clk)
if (LOAD) begin
   A = Ain;
   B = Bin;
end else begin
   A = B;    //blocking statement 1
   B = A;    //blocking statement 2
end

always @(posedge clk)
if (LOAD) begin
   C <= Cin;
   D <= Din;
end else begin
   C <= D;   //non-blocking statement 1
   D <= C;   //non-blocking statement 2
end

endmodule
...