如果同一数组被声明为不同的模式,则声明为输出寄存器的数组与保存在多触发器中的信号不能共存
an array declared as output reg with signals saved into multi flip-flop cannot coesist if the same array is delared into a different modue
我将这个数组(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
您的 dout
信号用作 b_cpu
模块的输入。根据经验,此信号只能在该模块内部读取。您不应该尝试为其赋值。
现在,您的 b_mux_write 模块就是这样做的,它通过 reg 类型的输出端口分配值。
因此,您从两端驱动相同的信号:tb 和 mux_write。我相信您看到的值是 'x' 正因为如此。您需要更改逻辑并添加一些多路复用器以将数据移动到正确的方向。
不要在内部分配给 'inputs'。您可以尝试利用 'inouts',但我认为您在这里不需要它。
我将这个数组(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
您的 dout
信号用作 b_cpu
模块的输入。根据经验,此信号只能在该模块内部读取。您不应该尝试为其赋值。
现在,您的 b_mux_write 模块就是这样做的,它通过 reg 类型的输出端口分配值。
因此,您从两端驱动相同的信号:tb 和 mux_write。我相信您看到的值是 'x' 正因为如此。您需要更改逻辑并添加一些多路复用器以将数据移动到正确的方向。
不要在内部分配给 'inputs'。您可以尝试利用 'inouts',但我认为您在这里不需要它。