代码之家  ›  专栏  ›  技术社区  ›  James Strieter

合成器能在编译时注意有意的“Z”吗?

  •  0
  • James Strieter  · 技术社区  · 3 年前

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

    如果用户可以将这个引脚硬编码为“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是否有什么不同。

    0 回复  |  直到 3 年前
        1
  •  2
  •   dave_59    3 年前

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

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

    你可以做的是写一个描述,将信号分配给X状态,合成工具会将其视为“ 不在乎 “并创建将信号分配到0或1状态的逻辑;无论哪种状态都可以减少所需的硬件数量。合成工具无法创建X状态的硬件,也无法创建可以检测X状态的软件。

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

    对于模拟调试,可以编写一个描述,检查信号是否已使用标识运算符指定为X或Z状态 === !== ,但没有合成可以创建检测到这一点的硬件,因为它不存在于硬件中。如果您尝试,它将生成一个错误。