首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Verilog错误“连续分配输出必须是净输出”

Verilog错误“连续分配输出必须是净输出”
EN

Stack Overflow用户
提问于 2021-05-01 02:18:17
回答 1查看 552关注 0票数 1

我正在做一个作业,我必须合成我的Verilog代码。我编写了代码并进行了编译和模拟,一切都很好。当我去合成时,设计编译器给了我一个模块错误。这个模块表示一个简单的8位移位寄存器和一个数据缓冲区.当我合成时,它给了我一个错误:

连续分配输出缓冲区必须是一个网络

我不知道这条信息是怎么说的。

代码语言:javascript
运行
复制
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 
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-01 11:21:52

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

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

代码语言:javascript
运行
复制
assign buffer[0] = shift_in; //This is where it states an error.

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

代码语言:javascript
运行
复制
        buffer <= {buffer[6:0],shift_in};

在你解决了这个问题之后,你仍然有问题。第二个always块是奇怪的,原因有很多。语法是合法的,但它不遵守良好的综合编码实践。也许您打算将两个always块组合成1:

代码语言:javascript
运行
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67342352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档