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 种状态的处理方式不同。
- case 语句执行“4 态测试”,也称为 "case equality"。将 case 表达式(在您的示例中为
tristate
)与 0
、1
、x
和 z
进行比较。当它是 z
时,采用默认分支,所以 flattened
是 1
,如您所见。
- 条件 ('ternary') 运算符也进行了 4 态测试,发现
tristate
为 z
。它不知道现在要做什么,所以它将您提供的两个值(0
和 1
)组合成结果 x
,这就是您所看到的。基本上,它试图变得聪明。参见 2005 LRM 中的 table 5-21。
请注意,if
语句 不会 进行 4 态测试。
三态:你很困惑,因为你的 control 信号 (tristate
) 转到 z
; data 信号 (flattened
) 应该发送到 z
。
您不会 'flatten' 三态进行合成;您通常模拟上拉或下拉。这将特定于您的技术,但您可能只需要实例化一个上拉或下拉组件。如果您有类似
的代码,您的合成器可能会或可能不会自动为您执行此操作
assign sig_o = (ena == 1'b1)? sig_i : 1'bz;
您需要阅读合成器文档才能确定。请注意,如果 ena
保证为 2 态 (0
/1
).
,您应该只使用这样的条件运算符
如何将三态总线转换为二态逻辑以进行综合?
我做了个小测试
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 种状态的处理方式不同。
- case 语句执行“4 态测试”,也称为 "case equality"。将 case 表达式(在您的示例中为
tristate
)与0
、1
、x
和z
进行比较。当它是z
时,采用默认分支,所以flattened
是1
,如您所见。 - 条件 ('ternary') 运算符也进行了 4 态测试,发现
tristate
为z
。它不知道现在要做什么,所以它将您提供的两个值(0
和1
)组合成结果x
,这就是您所看到的。基本上,它试图变得聪明。参见 2005 LRM 中的 table 5-21。 请注意,if
语句 不会 进行 4 态测试。
三态:你很困惑,因为你的 control 信号 (tristate
) 转到 z
; data 信号 (flattened
) 应该发送到 z
。
您不会 'flatten' 三态进行合成;您通常模拟上拉或下拉。这将特定于您的技术,但您可能只需要实例化一个上拉或下拉组件。如果您有类似
assign sig_o = (ena == 1'b1)? sig_i : 1'bz;
您需要阅读合成器文档才能确定。请注意,如果 ena
保证为 2 态 (0
/1
).