массив, объявленный как выходной reg, с сигналами, сохраненными в нескольких триггерах, не может сосуществовать, если один и тот же массив удален в другой режим

#verilog #hdl

Вопрос:

у меня есть этот arary(dout), который передается в модуль, где есть 8-битные синхронные триггеры, все работает нормально, но когда я передаю dout в другой модуль(b_mux_write) в качестве выходного reg [7:0] dout(я хочу изменить сигналы dout в другой модуль), как сломанный, если я изменю выходной reg [7:0] dout на входной[7:0] dout, все работает нормально, почему?

 //this module is just for declaring the clock and giving the signals 
//value to data, that are passed to the array dout, where every single element
// of dout correspond to a synchronous flip-flop
 module b_tb();
    reg clk;
    reg [7:0] data;
    wire [7:0] dout; 
    
  //Here i call the main module
    b_cpu b_cpu(
        data,
        dout

    );
    initial begin
        //initializing data, i know this is ugly, i'll make it more elegant in the future, i'm trying to create a processor :)
        data[0] = 1;
        data[1] = 1;
        data[2] = 1; 
        data[3] = 1; 
        data[4] = 1; 
        data[5] = 1; 
        data[6] = 1; 
        data[7] = 1; 
        
        clk = 1;

        $dumpfile("w.vcd");
        $dumpvars(0,b_tb);

    end 

always #1 clk = ~clk; //Here the clock switching from negative to positive
endmodule

    
//Main
module b_cpu(  
    //input clk ,
    input[7:0] data,
    input [7:0] dout
    );

    reg clk;
    
    fflop fflop(
        clk,
        data,
        dout
    );
    
    b_mux_read b_mux_read(
        clk,
        dout
    );
 

    b_mux_write b_mux_write(
        clk,
        dout
                 
    );
 
    initial begin
        clk = 1;
    end

    always #1 clk = ~clk;
    
    initial begin
        #2;
        $display("-----------cpu main begin-------");
        $display(dout[0]);
    end
endmodule
    
    module fflop(  
        input clk ,
        
        input[7:0] data,
        output reg[7:0] dout
        );
        
        //0;
        
        always@(clk) begin //LATCH DO1
            if(clk != 0)
                dout[0] <= data[0];
            else
                dout[0] <= 0;
           // $display(do1);
        end
         
        //1
        
        always@(clk) begin //LATCH DO1
            if(clk != 0)
                dout[1] <= data[1];
            else
                dout[1] <= 0;
           // $display(do1);
        end
    
        //2
        
        always@(clk) begin //LATCH DO1
            if(clk != 0)
                dout[2] <= data[2];
            else
                dout[2] <= 0;
           // $display(do1);
        end
    
        //3
    
        always@(clk) begin //LATCH DO1
            if(clk != 0)
                dout[3] <= data[3];
            else
                dout[3] <= 0;
           // $display(do1);
        end
    
        //4
    
        always@(clk) begin //LATCH DO1
            if(clk != 0)
                dout[4] <= data[4];
            else
                dout[4] <= 0;
           // $display(do1);
        end
    
        //5
    
        always@(clk) begin //LATCH DO1
            if(clk != 0)
                dout[5] <= data[5];
            else
                dout[5] <= 0;
           // $display(do1);
        end
    
        //6
    
        always@(clk) begin //LATCH DO1
            if(clk != 0)
                dout[6] <= data[6];
            else
                dout[6] <= 0;
           // $display(do1);
        end
    
        //7
    
        always@(clk) begin //LATCH DO1
            if(clk != 0)
                dout[7] <= data[7];
            else
                dout[7] <= 0;
           // $display(do1);
        end
    
        initial begin
           #1;
            $display("----flip-flop----");
            $display(dout[0]);
        end
    endmodule
    
//if i change output reg to input[7:0] dout the program works fine, but i need 
//the output reg, because i wan't to change the values of dout
module b_mux_write(input clk, output reg[7:0] dout);
endmodule

      
    module b_mux_read(input clk ,input[7:0] dout);
    endmodule

     
 

Ответ №1:

Ваш dout сигнал служит входом в b_cpu модуль. Эмпирическое правило состоит в том, что этот сигнал может быть прочитан только внутри этого модуля. Вы не должны пытаться присвоить ему значение.

Теперь ваш модуль b_mux_write просто делает это, он присваивает значение через выходной порт, который имеет тип reg.

В результате вы управляете одним и тем же сигналом с двух концов: tb и mux_write. Я верю, что ценности, которые вы видите, являются » x » только из-за этого. Вам нужно изменить свою логику и добавить некоторые дополнения, чтобы переместить ваши данные в правильном направлении.

Не назначайте внутренне «входы». Вы можете попробовать использовать «inouts», но я не думаю, что вам это нужно здесь.