Verilog:综合的三态,以及条件和案例之间的区别?

Verilog: tristates for synthesis, and difference between conditional and case?

如何将三态总线转换为二态逻辑以进行综合?

我做了个小测试

module test1( inout tristate, output flattened);
    assign flattened = tristate ? 1 : 0;
endmodule

module test2( inout tristate, output reg flattened);
    always @(tristate) begin
        case(tristate)
            0:          flattened = 0;
            default: flattened = 1;
        endcase
    end
endmodule

`timescale 1ns / 1ps

module test_tb;
    reg tristateEnable;
    reg tristateValue;
    wire tristate = tristateEnable ? tristateValue : 1'bz;
    wire flattened1, flattened2;

    test1 uut1(tristate, flattened1);
    test2 uut2(tristate, flattened2);

    initial begin
        tristateValue = 1'b0;
        tristateEnable = 1;
        #10 tristateValue = 1'b1;
        #10 tristateEnable = 1'b0;
    end

endmodule

模拟得到模块test1设置flattened为X,模块test2设置为1,后者是我想要的,但我还没有合成。有更好的/标准的方法吗?

您问了两个问题:(1) 条件运算符和 case 语句之间的区别是什么,以及 (2) 如何处理三态值。

关于语言问题:

简而言之,Verilog 具有 4 种状态数据类型,运算符对 4 种状态的处理方式不同。

  1. case 语句执行“4 态测试”,也称为 "case equality"。将 case 表达式(在您的示例中为 tristate)与 01xz 进行比较。当它是 z 时,采用默认分支,所以 flattened1,如您所见。
  2. 条件 ('ternary') 运算符也进行了 4 态测试,发现 tristatez。它不知道现在要做什么,所以它将您提供的两个值(01)组合成结果 x,这就是您所看到的。基本上,它试图变得聪明。参见 2005 LRM 中的 table 5-21。 请注意,if 语句 不会 进行 4 态测试。

三态:你很困惑,因为你的 control 信号 (tristate) 转到 zdata 信号 (flattened) 应该发送到 z。 您不会 'flatten' 三态进行合成;您通常模拟上拉或下拉。这将特定于您的技术,但您可能只需要实例化一个上拉或下拉组件。如果您有类似

的代码,您的合成器可能会或可能不会自动为您执行此操作
assign sig_o = (ena == 1'b1)? sig_i : 1'bz;

您需要阅读合成器文档才能确定。请注意,如果 ena 保证为 2 态 (0/1).

,您应该只使用这样的条件运算符