首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法连接verilog中的两个子模块之间的数据线

无法连接verilog中的两个子模块之间的数据线
EN

Stack Overflow用户
提问于 2017-05-26 07:06:54
回答 2查看 377关注 0票数 1

我已经试了好几天了,现在越来越沮丧,我无法理解我的错误。如果你能帮我个忙我会很感激的。下面是我的代码,在上面的模块中有两个模块,在完美地连接所有模块之后,模块连接就无法工作了。缺少从一个子模块到另一个子模块的输出(如果我从第一个子模块中删除我的始终代码)。如果始终代码在我的vc_buffers模块中没有注释,我甚至看不到RTL模式中的vc_buffers模块。

以下是完整的代码:

代码语言:javascript
复制
    `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
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-27 18:00:26

我一直在试图找出问题的真正根源。除了将rd_en信号连接到顶层模块之外,真正的问题是将1s和0分配给相同的rd_en和wr_en信号。整理好后一切看起来都很酷。至少我认为,如果有人能证实这一点,我会很感激的。

旧代码:

代码语言:javascript
复制
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;

我刚刚删除了vc_wr_en_0 <= 0;

谢谢各位

票数 0
EN

Stack Overflow用户

发布于 2017-05-26 08:09:58

这是因为rd_en在顶层模块中没有连接。由于fifo中的case语句,输出值(如flit_out )不会改变。因此,flit_buffers_fifo的输入值“vc_buffer”是常量,并将被裁剪。如果将rd_en初始化为1'b1,则会看到更改。更好的方法是将rd_en放入顶级模块信号列表中,并将其连接到fifo模块。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44195643

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档