无法连接verilog中两个子模块之间的数据线
我已经试了好几天了,结果越来越沮丧,我没能抓住我的错误。如果你能有人帮我,我将不胜感激。下面是我的代码,在顶部模块中有两个模块,在完美连接所有模块后,模块连接不知何故无法工作。从一个子模块到另一个子模块输入的输出丢失(如果我从第一个子模块中删除我的always代码)。如果在我的vc_buffers模块中未注释always代码,我甚至无法在RTL原理图中看到vc_buffers模块 以下是完整的代码:无法连接verilog中两个子模块之间的数据线,verilog,Verilog,我已经试了好几天了,结果越来越沮丧,我没能抓住我的错误。如果你能有人帮我,我将不胜感激。下面是我的代码,在顶部模块中有两个模块,在完美连接所有模块后,模块连接不知何故无法工作。从一个子模块到另一个子模块输入的输出丢失(如果我从第一个子模块中删除我的always代码)。如果在我的vc_buffers模块中未注释always代码,我甚至无法在RTL原理图中看到vc_buffers模块 以下是完整的代码: `timescale 1ns / 1ps `include "parameters.v
`timescale 1ns / 1ps
`include "parameters.v"
module router(
clk,
rst,
flit_in,
flit_out
);
localparam flit_size = flit_ctrl + flit_data;
localparam fifo_depth = buffer_depth - 1;
localparam fifo_counter = fifo_depth;
input clk, rst;
input [flit_size-1:0] flit_in;
wire [flit_size-1:0] flit_in;
output [flit_size-1:0] flit_out;
wire [flit_size-1:0] flit_out;
wire [flit_size-1:0] flit_buffers_fifo;
wire vc_empty_sig, vc_wr_en_sig;
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////// VC BUFFER INST /////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
vc_buffers vc_buffers_0(
.clk(clk),
.rst(rst),
.vc_flit_in_0(flit_in),
.vc_flit_out_0(flit_buffers_fifo),
.vc_empty_0(vc_empty_sig),
.vc_wr_en_0(vc_wr_en_sig)
);
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////// FIFO INST //////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
fifo fifo_0(
.clk(clk),
.rst(rst),
.wr_en(vc_wr_en_sig),
.rd_en(),
.flit_in(flit_buffers_fifo),
.flit_out(flit_out),
.empty(vc_empty_sig),
.full()
);
endmodule
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////// VC BUFFER /////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
module vc_buffers(
clk,
rst,
vc_empty_0,
vc_flit_in_0,
vc_flit_out_0,
vc_wr_en_0
);
localparam flit_size = flit_ctrl + flit_data;
localparam fifo_depth = buffer_depth - 1;
localparam fifo_counter = fifo_depth;
input clk;
input rst;
input vc_empty_0;
wire vc_empty_0;
input [flit_size-1:0] vc_flit_in_0;
wire [flit_size-1:0] vc_flit_in_0;
output vc_wr_en_0;
reg vc_wr_en_0;
output [flit_size-1:0] vc_flit_out_0;
reg [flit_size-1:0] vc_flit_out_0;
always @(posedge clk)
begin
if(rst) begin
vc_wr_en_0 <= 0;
end else begin
if (vc_empty_0) begin
vc_wr_en_0 <= 1;
//vc_flit_out_tmp_0 <= vc_flit_in_0; //Assign flit on input pins of router port 0
//vc_flit_out_wire_0 <= vc_flit_in_0; //Assign flit on input pins of router port 0
vc_flit_out_0 <= vc_flit_in_0; //Assign flit on input pins of router port 0
vc_wr_en_0 <= 0;
end else begin
vc_wr_en_0 <= 0;
// Discard buffer as there is no space in vc input buffer
end
end
end
endmodule
//////////////////////////////////////////////////////////////////////////////////
//////////////////////////// FIFO //////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
module fifo(
clk,
rst,
wr_en,
rd_en,
flit_in,
flit_out,
empty,
full
);
localparam flit_size = flit_ctrl + flit_data;
localparam fifo_depth = buffer_depth - 1;
localparam fifo_counter = fifo_depth;
input clk;
input rst;
input wr_en;
input rd_en;
input [flit_size-1:0] flit_in;
output [flit_size-1:0] flit_out;
output full, empty;
wire rd_en;
wire wr_en;
wire [flit_size-1:0] flit_in;
reg [flit_size-1:0] flit_out;
reg [fifo_depth-1:0] head;
reg [fifo_depth-1:0] tail;
reg empty;
reg full;
reg [flit_size-1:0] memory [0:7];
always @(posedge clk)
begin
if ( rst) begin
empty <= 1;
full <= 0;
flit_out <= 0;
head <= 0;
tail <= 0;
end else begin
case ( {wr_en, rd_en} )
2'b10,
2'b1x,
2'b1z:
begin
if (empty) begin
memory[head] <= flit_in;
head <= (head == fifo_counter)?0:head+1;
end else begin
// do nothing
end
end
2'b01,
2'bx1,
2'bz1:
begin
flit_out <= memory[tail];
tail <= (tail == fifo_counter)?0:tail+1;
end
default:;
endcase
end
if (head == fifo_counter) begin
full <= 1;
empty <= 0;
end else begin
end
if (tail == fifo_counter) begin
empty <= 1;
full <= 0;
end else begin
end
end
endmodule
`时间刻度为1ns/1ps
`包括“parameters.v”
模块路由器(
中华电力有限公司,
rst,
飞来飞去,
飞走
);
localparam flit_size=flit_ctrl+flit_数据;
localparam fifo_深度=缓冲区_深度-1;
localparam fifo_计数器=fifo_深度;
输入时钟,rst;
输入[flit_size-1:0]flit_in;
导线[flit_size-1:0]flit_in;
输出[flit_size-1:0]flit_out;
线[flit_size-1:0]飞出;
线[flit_size-1:0]flit_缓冲器\u fifo;
导线vc_empty_sig,vc_wr_en_sig;
//////////////////////////////////////////////////////////////////////////////////
////////////////////////////缓冲装置/////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
vc_缓冲区vc_缓冲区0(
.clk(clk),
.rst(rst),
.vc_flit_in_0(flit_in),
.vc_flit_out_0(flit_buffers_fifo),
.vc_empty_0(vc_empty_sig),
.vc_wr_en_0(vc_wr_en_sig)
);
//////////////////////////////////////////////////////////////////////////////////
////////////////////////////先进先出装置//////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
先进先出(
.clk(clk),
.rst(rst),
.wr_en(vc_wr_en_sig),
.rd_en(),
.flit_in(flit_缓冲区fifo),
.flit_out(flit_out),
.empty(vc_empty_sig),
.full()
);
端模
//////////////////////////////////////////////////////////////////////////////////
////////////////////////////VC缓冲区/////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////
模块vc_缓冲区(
中华电力有限公司,
rst,
vc_empty_0,
vc_flit_in_0,
vc\u飞出\u 0,
vc_wr_en_0
);
localparam flit_size=flit_ctrl+flit_数据;
localparam fifo_深度=缓冲区_深度-1;
localparam fifo_计数器=fifo_深度;
输入时钟;
输入rst;
输入vc_empty_0;
导线vc_为空_0;
在0中输入[flit_size-1:0]vc_flit_;
导线[flit_size-1:0]vc_flit_in_0;
输出vc_wr_en_0;
注册vc_wr_en_0;
输出[flit_size-1:0]vc_flit_out_0;
reg[flit\u size-1:0]vc\u flit\u out\u 0;
始终@(posedge clk)
开始
如果(rst)开始
vc_wr_en_0这是因为rd_en在顶层模块中是不连接的。由于fifo中的case语句,输出值(如flit_out)不会改变。因此vc_buffer的输入值“flit_buffers_fifo”是常量,将被修剪。
如果您将rd_en初始化为1'b1,您将看到更改。
更好的方法是将rd_en放入顶级模块信号列表中,并将其连接到fifo模块。我一直在尝试跟踪问题的实际根源。除了将rd_en信号连接到顶部模块外,真正的问题是将1和0分配给相同的rd_en和wr_en信号。经过整理,一切看起来都很酷。至少在我看来,如果有人能证实这一点,我将不胜感激
旧代码:
if (vc_empty_0) begin
vc_wr_en_0 <= 1;
vc_flit_out_0 <= vc_flit_in_0; //Assign flit on input pins of router port 0
vc_wr_en_0 <= 0;
if(vc\u empty\u 0)开始
vc_wr_en_0@user3773485如果这是正确的答案,请点击勾号将其标记为已回答,使其变为绿色。这让其他人知道你收到了正确的答案。