2017-05-26 566 views
1

我一直在尝试几天,它越来越沮丧,我无法捕捉到我的错误。如果你能帮助我,我将不胜感激。以下是我的代码,我有一个顶级模块内的两个模块,连接完成后,模块连接以某种方式无法正常工作。从一个子模块到另一个子模块输入的输出缺失(如果我从第一个子模块中删除了我的始终代码)。如果在我的vc_buffers模块中取消注释始终代码,我甚至无法在RTL原理图中看到vc_buffers模块。无法在verilog中的两个子模块之间连接数据线

下面是完整的代码:

`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 

回答

0

我一直在试图追溯问题的实际根源。除了将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; 

我刚除去vc_wr_en_0 < = 0;

谢谢你们伙计

2

这是因为RD_EN是在顶层模块无关。由于您在fifo中的case语句,输出值(如flit_out)不会改变。所以vc_buffer的输入值“flit_buffers_fifo”是不变的,并且会被修剪。 如果您将rd_en初始化为1'b1,您将看到更改。 更好的方法是将rd_en放在顶层模块信号列表中并将其连接到fifo模块。

+0

谢谢Laleh。它像魔术一样工作。 :) –

+1

@ user3773485如果这是正确的答案,请将其标记为已回答,方法是单击勾号使其变为绿色。这可以让其他人知道你已经收到了正确的答案。 – Morgan