iCEstick + yosys-使用全局设置/重置(GSR)

Myl*_*ock 4 fpga yosys

这可能是一个iCEstick问题,而不是yosys问题,但是由于我使用的是Icestorm工具链,所以在这里提出了问题。

我想指定设计的启动行为,互联网上的各个地方似乎都同意这种启动行为与通常命名的rst信号有关。对于我来说,这种信号的来源并不明显,所以我深入研究了通电序列。当前的理解来自本文档中的图2 。

CDONE器件将其拉高后,所有内部寄存器均已复位为某个初始值。现在,我已经找到了大量关于每种类型的触发器或硬IP如何接收复位信号并对其内部状态进行处理的点阵文档,但我仍然不太了解如何指定这些状态(或甚至只知道它们是什么,所以我可以使用它们)。

例如,如果我想在通电后(且在通电后)将LED高电平显示1秒钟,那么我想在此复位信号(无论它是什么)禁用后启动一个计数器。

ice40系列数据表和Lattice站点上浏览时,我找到了有关使用Global Set / Reset信号的文档。我确认GSR在系列数据表中对此进行了提及,该数据表在第2-3页的“时钟/控制分配网络”下引用。全局复位信号似乎可由全局缓冲器之一使用,GBUF[0-7]并且可以通过全局/高扇出分配网络路由到所有LUT(最多4个)。

这似乎和我追求的完全一样,但是我找不到有关如何在设计中使用此信息的其他信息。有关使用GSR的文档指出,您可以像这样实例化本机GSR组件:

GSR GSR_INST (.GSR (<global reset sig>));
Run Code Online (Sandbox Code Playgroud)

但是我不能说这是否只是为了模拟。我在这里完全是朝错误的方向前进还是只是缺少一些东西?我对FPGA和硬件没有足够的经验,因此我的整个方法完全有缺陷。

Cli*_*nna 5

我不确定该GSR文件是否实际上与iCE40有关。莱迪思iCEcube工具有趣地接受GSR单元的实例,但似乎只是将它们视为恒定的零驱动器。在iCE40 sim库中也没有针对GSR单元类型的仿真模型,在Lattice提供的iCE40技术库文档中也没有对此模型的描述。

此外,我已经使用晶格工具构建了以下两种设计,除了生成的比特流文件的“注释字段”中的时间戳之外,生成的比特流是相同的!(此测试是使用Lattice LSE作为综合工具而不是Synplify进行的。由于某种原因,我无法使Synplify在我的计算机上运行,​​并在一年多前放弃了这样做。)

这是我使用的第一个测试设计:

module top (
    input clk,
    output rst,
    output reg val
);
    always @(posedge clk, posedge rst)
        if (rst)
            val = 1;
        else
            val = 0;

    GSR GSR_INST (.GSR (rst));
endmodule
Run Code Online (Sandbox Code Playgroud)

这是第二个测试设计:

module top (
    input clk,
    output rst,
    output val
);
    assign val = 0, rst = 0;
endmodule
Run Code Online (Sandbox Code Playgroud)

鉴于此结果,我认为可以肯定地说,晶格工具只是忽略了iCE40设计中的GSR单元。(也许是为了与其他FPGA系列兼容?)

那么,如何产生第一个信号呢?例如,以下是一个简单的重置生成器,resetn它在前15个周期内置为有效(拉低):

input clk;
...

wire resetn;
reg [3:0] rststate = 0;
assign resetn = &rststate;
always @(posedge clk) rststate <= rststate + !resetn;
Run Code Online (Sandbox Code Playgroud)

(IceStorm流确实支持寄存器的任意初始化值,而晶格工具会忽略初始化值,只是将所有FF初始化为零。因此,如果您希望设计在工具之间可移植,建议仅将regs初始化为零。 )

如果使用的是PLL,则习惯上使用PLL LOCK输出来驱动resetn信号。不幸的是,“ iCE40 sysCLOCK PLL设计和使用指南”没有说明所生成的LOCK信号是否已经与所生成的时钟同步,因此,将其与时钟同步以避免出现亚稳态问题是一个好主意:

wire clk, resetn, PLL_LOCKED;
reg [3:0] PLL_LOCKED_BUF;
...

SB_PLL40_PAD #( ... ) PLL_INST (
  ...
  .PLLOUTGLOBAL(clk),
  .LOCK(PLL_LOCKED)
);

always @(posedge clk)
    PLL_LOCKED_BUF <= {PLL_LOCKED_BUF, PLL_LOCKED};

assign resetn = PLL_LOCKED_BUF[3];
Run Code Online (Sandbox Code Playgroud)

关于全局网络的使用:您可以通过全局网络(使用SB_GB原语)显式地路由resetn信号,但是使用IceStorm流,arachne-pnr将自动路由一个设置/重置信号(当被多个FF使用时) )(如果有可用的全球网络)。

  • 太好了,这现在要清楚得多。我同意,与ICE相比,GSR搜索提供了更多有关EPC3 / 5系列的信息...检查yosys的网络清单对我来说有更多帮助,所以谢谢!我主要想要某种双重检查,以确保初始寄存器值是正确的处理方法。谢谢agin (2认同)