分段错误:使用 yosys 编译时出现 11

Posted

技术标签:

【中文标题】分段错误:使用 yosys 编译时出现 11【英文标题】:Segmentation fault: 11 while compiling with yosys 【发布时间】:2019-08-08 15:35:33 【问题描述】:

我正在尝试实现一个 Verilog 模块,该模块使用 Yosys SB_SPRAM256KA 块写入 Lattice UP5K SPRAM 硬件内核。请注意,关于此黑盒块的使用的文档/示例很少或没有。主要目的是在音频数字系统中实现回声或延迟。

我有两个时钟,帧时钟lrclk和位时钟bclk,注意每个帧时钟周期有64个位时钟周期。

我尝试使用blck 中的敏感度列表,在 SPRAM 中循环读取/写入过程。我实现了一个状态机:

S1:将输入数据放入RAM的输入端口,使能write_enable信号并将写指针设置为RAM地址。 S2:(应该写入的数据)禁用 write_enable 信号并将读取指针设置为 RAM 地址。 S3:(数据应该加载到 RAM 的输出缓冲区)。从 RAM 输出缓冲区设置模块输出并重置状态机。

这是模块代码:

module echo(    
    input wire bclk,
    input wire lrclk,

    input wire [DATALEN-1:0] right_in,
    output reg [DATALEN-1:0] right_out,
);

localparam ADDRLEN = 14;
localparam DATALEN = 16;

reg [ADDRLEN-1:0] rd_ptr = 0;
reg [ADDRLEN-1:0] wr_ptr = (2**ADDRLEN)/2;

reg [2:0] sm = 0;

reg wren;
reg [ADDRLEN-1:0] memaddr;
reg [DATALEN-1:0] datain;
reg [DATALEN-1:0] dataout;

SB_SPRAM256KA M1 (
    .ADDRESS(memaddr),
    .DATAIN(datain),
    .MASKWREN(4'b1111),
    .WREN(wren),
    .CHIPSELECT(1'b1),
    .CLOCK(bclk),
    .STANDBY(1'b0),
    .SLEEP(1'b0),
    .POWEROFF(1'b0),
    .DATAOUT(dataout)
  );

always @(posedge lrclk) begin
    sm <= 1;
end

always @(posedge bclk) begin
    if (sm === 1) begin
        datain <= right_in;
        wren <= 1;
        memaddr <= wr_ptr;
        sm <= 2;
    end else if (sm === 2) begin
        wren <= 0;
        memaddr <= rd_ptr;
        sm <= 3;
    end else if (sm === 3) begin
        right_out <= dataout;
        wr_ptr <= (wr_ptr + 1);
        rd_ptr <= (rd_ptr + 1);
        sm <= 0;
    end
end

endmodule

我希望在 systhesis 时间或实现的错误行为上出现错误,但我得到了这个 Yosis 错误:

5.11. Executing WREDUCE pass (reducing word size of cells).
Removed top 31 bits (of 32) from port B of cell main.$add$main.v:70$2 ($add).
Removed top 1 bits (of 32) from port Y of cell main.$add$main.v:70$2 ($add).
Removed top 2 bits (of 3) from FF cell main.$techmap\E1.$procdff$117 ($dff).
make: *** [main.bin] Segmentation fault: 11

【问题讨论】:

对于综合来说,一个寄存器只能分配在一个always块中。 sm 由两个不同的 always 块分配。根据lrclkbclk 之间的关系,您将需要跨时钟域同步器或将lrclk 视为启用触发信号而不是时钟。 【参考方案1】:

.POWEROFF(1'b0) 应该是 1'b1 吧?

有关详细信息,请参阅“iCE40 SPRAM 使用指南”。

【讨论】:

以上是关于分段错误:使用 yosys 编译时出现 11的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:在 C++ 中弹出向量时出现 11

Swift:从 iOS 7 编译存档时出现分段错误

获取 QString 时出现分段错误

调用 globfree() 时出现分段错误

运行我的代码时出现分段错误(核心转储)问题

将结构插入地图时出现分段错误