我在verilog中做了一个错误控制代码,我得到了18000 ns延迟的解码数据。我需要将解码后的数据与原始数据进行比较,但我的原始数据开始大约 100 ns,那么如何对这两个信号进行比较。
如何在verilog中延迟我的输入数据并且应该是可合成的?
我需要实现这是硬件。
一种选择是手动实例化一个或多个缓冲单元。为此,您需要知道有关您的技术库的单元名称,并且您的 RTL 代码将取决于技术。如果您不希望这样,您也可以创建自己的缓冲模块(例如使用逆变器)并使用它。
这是 Verilog 实例化的示例。BUFX1 是任意库中的单元名称。
BUFX1 my_buffer (.in(my_signal), .out(my_delayed_signal));
通常,综合和 P&R 工具会优化此单元格,但您可以告诉工具您要保留它。下面的示例约束采用 Synopsys 设计约束 (SDC) 格式。大多数工具供应商都支持它。
set_dont_touch <path to my_buffer>
您应该知道每个角落的单元延迟会有所不同(例如,慢、典型、快)。所以延迟不是恒定的,而是在一个范围内。
产生延迟的同步方法是使用移位寄存器,它将您要比较的数据根据需要移位尽可能多的时钟周期。使用这种方法,或使用评论中建议的计数器,您应该会达到接近目标的延迟。
但是,如果您的时钟周期不适合移位寄存器,您可以通过半手动缓冲信号来产生延迟:
使用您的综合工具生成所需的延迟。例如,使用 Synopsys 的 Design Compiler:将至少在和之间set_min_delay delay_value_in_ns -from startpoint -to endpoint
指示您想要正确的工具。您还可以设置一个值来约束最大值:delay_value_in_ns
startpoint
endpoint
set_max_delay
这些约束必须转发到进一步的流程步骤,如布局和布线,以保持正确的延迟。