Verilog 错误“连续赋值输出必须是网络”

问题描述

我正在完成一项任务,我必须在其中综合我的 Verilog 代码。我写了代码并编译和模拟,一切正常。当我进行综合时,设计编译器在我的一个模块中给了我一个错误。该模块代表一个带有数据缓冲器的简单 8 位移位寄存器。当我合成时,它给了我一个错误:

连续赋值输出缓冲区必须是网

我不知道这条消息在说什么。

module shiftReg(output shift_out,output reg [7:0] data_buff,input shift_write,clk,shift_in,input [7:0] data);

    reg [7:0] buffer;
    assign shift_out = buffer[7];
    assign buffer[0] = shift_in; //This is where it states an error.
    always@(posedge clk) begin
        if(shift_write == 1) begin
            buffer <= {buffer[6:0],shift_in};
        end
    end
    always@(shift_write) begin
        if(shift_write == 0) begin
            data_buff <= buffer;
            buffer <= data;
        end
    end

endmodule 

解决方法

该消息告诉您,您使用连续赋值(使用 assign 关键字)分配给的信号必须是网络类型变量,例如 wire。但是,您将 buffer 声明为 reg 类型变量。这是非法的,你的模拟器至少应该在你开始合成之前警告你这一点。我使用的模拟器给了我编译错误。

你可以简单地删除这一行:

assign buffer[0] = shift_in; //This is where it states an error.

在第一个 always 块中,您已经在行中隐式地将 buffer[0] 分配给 shift_in

        buffer <= {buffer[6:0],shift_in};

在你解决这个问题后,你仍然有问题。由于多种原因,第二个 always 块是奇数。语法是合法的,但它不遵守良好的综合编码实践。也许您打算将 2 个 always 块合并为 1 个:

module shiftReg (
    output shift_out,output reg [7:0] data_buff,input shift_write,clk,shift_in,input [7:0] data
);

    reg [7:0] buffer;
    assign shift_out = buffer[7];
    always @(posedge clk) begin
        if (shift_write) begin
            buffer <= {buffer[6:0],shift_in};
        end else begin
            data_buff <= buffer;
            buffer <= data;
        end
    end
endmodule 

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...