应为左侧对象的verilog代码中的错误分配一个变量

应为左侧对象的verilog代码中的错误分配一个变量,verilog,intel-fpga,Verilog,Intel Fpga,我一直试图在verilog中创建一个异步fifo,但我面临一个问题:赋值左侧的对象“空”和“满”应该具有变量数据类型 顶部模块: module async_fifo (reset, wclock, rclock, datain, dataout, e, f); input [15:0] datain; output reg [15:0] dataout; //reg [15:0] mem1, mem2, mem3, mem4, mem5, mem6, mem7, mem8; reg [15:0]

我一直试图在verilog中创建一个异步fifo,但我面临一个问题:赋值左侧的对象“空”和“满”应该具有变量数据类型

顶部模块:

module async_fifo (reset, wclock, rclock, datain, dataout, e, f);
input [15:0] datain;
output reg [15:0] dataout;
//reg [15:0] mem1, mem2, mem3, mem4, mem5, mem6, mem7, mem8;
reg [15:0] mem [7:0];
input reset, rclock, wclock;
/*reg [0:2] wptr, rptr;
initial wptr = 3'b000;
initial rptr = 3'b000;*/
integer wflag = 0, rflag = 0;
wire empty , full;
input e,f;
reg [0:2] wptr = 3'b000, rptr = 3'b000;

counter c(wclock, rclock, empty, full);
e = empty;
f = full;

always@(posedge wclock)
    begin
        if(f == 1'b0)
        begin
            e = 1'b0;
            if (wptr < 3'b111)
                begin
                    mem[wptr] = datain;
                    wptr = wptr + 3'b001;
                end

            else if(wptr == 3'b111 && wflag == 0)
                wflag = 1;

            else if (wflag == 1)
                begin
                    wptr = 3'b000;
                    wflag = 0;
                end 
        end
    end

always@(posedge rclock)
    begin
        if(e == 1'b0)
        begin
            f = 1'b0;
            if (rptr < 3'b111)
                begin
                    dataout = mem[rptr];
                    rptr = rptr + 3'b001;
                end

            else if(rptr == 3'b111 && rflag == 0)
                rflag = 1;

            else if (rflag == 1)
                begin
                    rptr = 3'b000;
                    rflag = 0;
                end 
        end
    end
endmodule   

您正在行为块的左侧使用full和empty(始终)。所以它们必须是寄存器。 但同时它们是计数器的输出,必须是导线。 您不能以这种方式使用变量。它们可以是一个瞬间的输出,只用于代码其他部分的右侧,也可以是行为块左侧的regsietr,也可以是另一个瞬间的输入。 你最好改变你的编码风格

以下是异步FIFO的示例:

你还需要研究阻塞和非阻塞分配以及竞赛条件。看看这个:


作为verilog的新手,我无法找到新的编码方式来解决这个问题。你能帮我解决这个问题吗?我已经编辑了代码,知道我收到一个错误,说aync_fifo代码中的语句“e=empty;”应该是“.”或“(”。错误是:“error(10170):Verilog HDL语法错误,在async_fifo.v(16)附近,文本“=”应该“,”或“(”可能的重复
module counter(w_clock, r_clock, empty, full);
input w_clock, r_clock;
output reg empty = 0, full = 0;
integer rear = 0, front = 0;    

always @ (posedge w_clock)
    begin
        if ((front == 1 && rear == 8) || front == rear + 1)
            full = 1;

        else if(rear == 8)
            begin
                rear = 1;
                empty = 0;
            end

        else
            begin
                rear = rear+1;
                empty = 0;
            end
    end

    always @ (posedge r_clock)
    begin
        if (front == 0 && rear == 0)
            empty = 1;

        else if(front == 8)
            begin
                front = 1;
                full = 0;
            end

        else
            begin
                front = front+1;
                full = 0;
            end
    end
endmodule