合成器能否在编译时注意故意的“Z”?

问题描述 投票:0回答:1

在 Verilog 中,我有一个输入端口,我想将其设为可选。它是微体系结构的起始引脚。如果用户不想手动驱动启动引脚,模块将使用自己的内部时钟来驱动启动引脚。

如果用户可以将此 pin 硬编码为“Z”,那么模块就会有这样的代码片段:

always @(posedge clk) begin 
  if (rst == 1'b1) begin 
    ...
  end else begin 
    if (start == 1'bz) begin 
      start_2 <= internally_generated_strobe;
    end else begin 
      start_2 <= start;
    end
  end
end

实例化这个模块的端口映射是这样的:

my_module INST_NAME (
  .clk(clk),
  .rst(rst),
  .start(1'bz),
  ...
  );

这是大多数合成器都支持的东西吗?还是会得到奇怪的结果?

我在 Verilog 中给出了这个例子,但如果 VHDL 与 Verilog 有什么不同,我也很感兴趣。

verilog vhdl fpga synthesis
1个回答
1
投票

真正的硬件中没有X或Z状态这样的东西,它是数字离散模拟创建的抽象。在实际硬件中,信号具有模拟电压,其阈值被视为 0 或 1。

可以创建一个模拟电路来检测信号是否未驱动,但没有数字合成可以做到这一点。

您可以做的是编写一个将信号分配给 X 状态的描述,综合工具会将其视为“don't care”并创建将信号分配给 0 或 1 状态的逻辑;无论哪种状态都会减少所需的硬件数量。综合工具无法创建处于 X 状态的硬件,也无法创建可以检测 X 状态的硬件。

你们都可以写一个描述,将一个信号分配给 Z 状态,这样另一个分配给同一个信号的语句就可以驱动 0 或 1 状态。综合工具将创建硬件以关闭该信号的驱动器,但信号最终将解析为 0 或 1 状态,具体取决于信号上是否存在其他活动驱动器或导线的电荷衰减时间。

对于仿真调试,您可以编写一个描述来检查信号是否已使用恒等运算符

===
!==
分配了 X 或 Z 状态,但是没有综合可以创建检测到的硬件,因为它不存在于硬件。如果你尝试它会产生一个错误。

© www.soinside.com 2019 - 2024. All rights reserved.