Verilog多模块实例化时遇到的问题

代码的目的:定义两个module块来模拟AB芯片,并且分别编号为0、1。FPGA是主模块,通过计数器产生0~5的控制信号,然后对控制信号进行分选后判断当前需要访问的是哪个芯片,然后再实例化该模块,同时得到其输出值。

FPGA代码:

module FPGA(clk,reset,cont,out);  //主模块
input clk,reset;  //时钟信号和复位信号
output [2:0] cont;  //控制信号
output [7:0] out;  //用于存放从芯片接收来的数据
reg [2:0] cont;
wire[7:0] out;
integer flag;
always @(posedge clk or negedge reset)//产生控制信号(计数器电路)
begin
    if(!reset)
        cont=0;
    else if(cont==5) cont=0;
        else cont=cont+1;
end
begin
    A Amodule(.clk(clk),.cont(cont),.out(out));
    B Bmodule(.clk(clk),.cont(cont),.out(out));
end
endmodule

A、B模块的定义:

module A (clk,cont,out);
input clk;
input [2:0]cont;
output [7:0] out;
reg[7:0] out;
always@(posedge clk)
begin
    out=0;//初始化,防止出现不确定量
    if(cont==0)
        out=1;  //若控制信号为0,则使能A芯片并输出数值1
end
endmodule

module B (clk,cont,out);
input clk;
input [2:0]cont;
output [7:0] out;
reg[7:0] out;
always@(posedge clk)
    begin
    out=0;//初始化
    if(cont==1)
        out=2;      //若控制信号为1,则使能A芯片并输出数值2
    end
endmodule

问题描述:在时序仿真过程中输出的结果如下图

img

如果将PFGA代码中的A、B模块的实例化删减剩A,则时域仿真结果正常

img

怀疑是出现了竞争与冒险现象,但是我不知道应该怎么改动!所以想请教一下各位这个代码应该怎么改。
(PS:我试过用在FPGA模块中的always模块外,用控制信号+case模块来实现分时实例化模块,但是报错说“控制信号”非常数,可能是因为没有在always模块内部使用case,但是如果在always模块中用case来实例化,就又会报错,因为模块的实例化没有办法在always模块里进行……所以很苦恼)

cont 是变量,正常的 case 得写在 always 里
否则就需要用常数去整 case


module FPGA(clk,reset,cont,out);//主模块
input clk,reset;  //时钟信号和复位信号
output [2:0] cont;  //控制信号
output [7:0] out;  //用于存放从芯片接收来的数据
reg [2:0] cont;
wire[7:0] out,out1,out2,out3,out4,out5,out6;
reg[7:0] out_r;
integer flag;
always @(posedge clk or negedge reset)//产生控制信号(计数器电路)
begin
    if(!reset)
        cont=0;
    else if(cont==5) cont=0;
        else cont=cont+1;
end
    A Amodule(.clk(clk),.cont(cont),.out(out1));
    B Bmodule(.clk(clk),.cont(cont),.out(out2));
    C Cmodule(.clk(clk),.cont(cont),.out(out3));
    D Dmodule(.clk(clk),.cont(cont),.out(out4));
    E Emodule(.clk(clk),.cont(cont),.out(out5));
    F Fmodule(.clk(clk),.cont(cont),.out(out6));
    assign    out = out_r;
    
always @(*)
begin
    case(cont)
    0: out_r=out1;
    1: out_r=out2;
    2: out_r=out3;
    3: out_r=out4;
    4: out_r=out5;
    5: out_r=out6;
    default: out_r=0;
    endcase
end

endmodule
 

A,B 俩输出的都是 out ,短路了,不对的。当俩输出不一样时就出错了。


module FPGA(clk,reset,cont,out);  //主模块
input clk,reset;  //时钟信号和复位信号
output [2:0] cont;  //控制信号
output [7:0] out;  //用于存放从芯片接收来的数据
reg [2:0] cont;
wire[7:0] out1;
wire[7:0] out2;
integer flag;
always @(posedge clk or negedge reset)//产生控制信号(计数器电路)
begin
    if(!reset)
        cont=0;
    else if(cont==5) cont=0;
        else cont=cont+1;
end
begin
    A Amodule(.clk(clk),.cont(cont),.out(out1));
    B Bmodule(.clk(clk),.cont(cont),.out(out2));
    assign out=cont==0 ? out1:out2;
end
endmodule