-2

I have the main module with FIFO stuff.
Here it is:

module syn_fifo #(
    parameter DATA_WIDTH = 8,   // inpit capacity
    parameter DATA_DEPTH = 8    // the depth of the FIFO
)
(
    input wire clk,
    input wire rst,
// Write_______________________________________________
    input wire [DATA_WIDTH-1:0]din,     // the input data
    input wire wren,                    // Write anable
    output wire full,
// Read________________________________________________
    output wire [DATA_WIDTH-1:0]dout,   // The output data
    input wire rden,                    // Read enable
    output wire empty
);  
    
integer q_size;         // The queue size(length)
integer golova;         // The queue beginning
integer hvost;          // The end of queue

reg [DATA_WIDTH-1:0]fifo[DATA_DEPTH-1:0];

assign full = (q_size == DATA_DEPTH) ? 1'b1: 1'b0;          // FIFO is full
/*
True { full = (q_size==DATA_TEPTH) = 1 }, then wire "full" goes to "1" value
False { full = (q_size==DATA_TEPTH) = 0 }, then wire "full" goes to "0" value
*/
assign empty = (golova == hvost);                           // FIFO is empty
assign dout = fifo[hvost];                                  // FWFT (other write mode)

integer i;

//___________(The queue fullness)___________________
always @(posedge clk or posedge rst)
begin

    if (rst == 1'b1)
        begin
            for (i = 0; i < DATA_DEPTH; i = i + 1)              // incrementing the FIFO
                fifo[i] <= 0;                                   // Resetting the FIFO
                golova <= 0;                                    // Resetting the queue start variable
        end 
    
    else
    
    begin       //Write_______________________________________
    if (wren && ~full)
        begin
            fifo[golova] <= din;                    // putting data in to the golova
                if (golova == DATA_DEPTH-1)         // restrictions for the queue beginning
                    golova <= 0;                    // Reset the beginning
                else
                golova <= golova + 1;               // other occurence incrementing
        end 
    end
end
//Reading
always @(posedge clk or posedge rst)
begin
        if (rst == 1'b1)
            begin
                hvost <= 0;
            end

        else
            begin
                if (rden && !empty)
    /*for staying inside the queue limits - make the check of non equality of the "hvost" & "queue size"*/              
                    begin
                        if (hvost == DATA_DEPTH-1)              // if hvost = DATA_DEPTH-1, then
                            hvost <= 0;                         // Reset hvost
                        else
                            hvost <= hvost + 1;
                    end
            end
end



always @ (posedge clk) 

    begin
        if (rst == 1'b1) begin
            q_size <= 0;
        end 
    
    else 
        begin
            case ({wren && ~full, rden && ~empty} )
                2'b01: q_size <= q_size + 1;    // RO
                2'b10: q_size <= q_size - 1;    // WO
                default: q_size <= q_size;      // read and write at the same time
            endcase     
        end
end

endmodule

Also i've got the testbench module down delow:

`timescale 1ns / 1ps

module fifo_tb();

localparam CLK_PERIOD = 10;

reg clk;
reg rst;

always begin
    clk <= 1'b0;
    #(CLK_PERIOD / 2);
    clk <= 1'b1;
    #(CLK_PERIOD / 2);
end

localparam DATA_WIDTH = 8;
localparam DATA_DEPTH = 4;

reg [DATA_WIDTH-1:0]din;
reg wren;
reg rden;
wire [DATA_WIDTH-1:0]dout;
wire empty;
wire full;

wire wr_valid;
wire rd_valid;

task write;
    input integer length;
    begin
        if (length) begin
            @(posedge clk);
            wren <= 1'b1;
            while (length) begin
                @(posedge clk);
                if (wr_valid) begin
                    length <= length - 1;
                    if (length == 1) begin
                        wren <= 1'b0;
                    end
                end
            end
        end
    end
endtask

task read;
    input integer length;
    begin
        if (length) begin
            @(posedge clk);
            rden <= 1'b1;
            while (length) begin
                @(posedge clk);
                if (rd_valid) begin
                    length <= length - 1;
                    if (length == 1) begin
                        rden <= 1'b0;
                    end
                end
            end
        end
    end
endtask

initial begin

    rst <= 1'b0;
    wren <= 1'b0;
    rden <= 1'b0;
    #50;
    rst <= 1'b1;
    #50;
    rst <= 1'b0;
    #200;
    /* Test Start */
    //write(4);
    //read(4);
    /* Test Stop */
    #1000;
    $finish;
end

assign wr_valid = wren & ~full;
assign rd_valid = rden & ~empty;

always @(posedge clk) begin
    if (rst == 1'b1) begin
        din <= 0;
    end else begin
        if (wr_valid == 1'b1) begin
            din <= din + 1;
        end
    end
end

// write?
always begin
    #400;
    write(5);
    #15;
    write(7);
    #25;
    write(3);
    #15;
    write(9);
    #15;
    write(1);
    #10000;
end

// read?
always begin
    #420;
    read(3);
    #37;
    read(13);
    #21;
    read(7);
    #15;
    read(9);
    #15;
    read(4);
    #20;
    read(7);
    #10000;
end


initial begin
            $dumpfile("test.vcd");
            $dumpvars(0,fifo_tb);   
        end

syn_fifo #(.DATA_WIDTH(DATA_WIDTH),
           .DATA_DEPTH(DATA_DEPTH))  dut (  .clk(clk),
                                            .rst(rst),
                                            .din(din),
                                            .wren(wren),
                                            .full(full),
                                            .dout(dout),
                                            .rden(rden),
                                            .empty(empty));

endmodule

Trying to compile all of it with iVerilog + GTKwave + Win10 by next command:
C:\Program Files\iverilog\bin>iverilog -o fifo.v fifo_tb.v

The compiler gives me the next message:

fifo_tb.v:138:error: Unknown module type:syn_fifo   
2 error(s) during elaboration.
These modules were missing:syn_fifo referenced 1 times

At the necessary line "138" maybe the main mistake is covered by the "Number sign" in module instantiation?

/*132|*/            initial begin
/*133|*/                        $dumpfile("test.vcd");
/*134|*/                        $dumpvars(0,fifo_tb);   
/*135|*/                    end
/*136|*/
/*137|*/            syn_fifo #(.DATA_WIDTH(DATA_WIDTH),
/*138|*/                       .DATA_DEPTH(DATA_DEPTH))  dut (  .clk(clk),
/*139|*/                                                        .rst(rst),
/*140|*/                                                        .din(din),
/*141|*/                                                        .wren(wren),
/*142|*/                                                        .full(full),
/*143|*/                                                        .dout(dout),
/*144|*/                                                        .rden(rden),
/*145|*/                                                        .empty(empty));
/*146|*/
/*147|*/            endmodule 

I'm not shure of that.

sht4Bitch
  • 1
  • 1

2 Answers2

1

Seems like you are indicating fifo.v to be your output file, try:

iverilog -o syn_fifo.tb -s fifo_tb fifo_tb.v fifo.v

-o -> output file
-s -> top module (in this case, the test one)
(after everything, include all the files)

Then, to run it:

vvp syn_fifo.tb
m4j0rt0m
  • 354
  • 1
  • 5
  • Thank you, dear @m4j0rt0m! I just forgot to type in the output file name at the CMD window. Was very exhausted so haven't noticed such a detail)) Usually it looks like: ```iverilog -o OUTPUT_FILE_NAME fifo_tb.v fifo.v``` And also I tried your advice, and it's finally done! – sht4Bitch Jul 28 '20 at 14:43
0

Thank you, dear @m4j0rt0m
I just forgot to type in the output file name at the CMD window. Was very exhausted so haven't noticed such a detail)))

Usually it looks like: iverilog -o OUTPUT_FILE_NAME fifo_tb.v fifo.v

And also I tried your advice, and it's finally done!

sht4Bitch
  • 1
  • 1