【问题标题】:Verilog error "continuous assignment output must be a net"Verilog错误“连续赋值输出必须是网络”
【发布时间】:2021-05-01 02:18:17
【问题描述】:

我正在执行一项任务,我必须合成我的 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 

【问题讨论】:

    标签: verilog synthesis


    【解决方案1】:

    该消息告诉您,通过连续赋值(使用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 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 2021-02-03
      相关资源
      最近更新 更多