我阅读的教科书使用内置的原始模块实现了1位加法器:
module yAdder1(z, cout, a, b, cin);
output[0:0] z, cout;
input[0:0] a, b, cin;
wire[0:0] tmp, outL, outR;
xor left_xor(tmp, a, b);
xor right_xor(z, cin, tmp);
and left_and(outL, a, b);
and right_and(outR, tmp, cin);
or my_or(cout, outR, outL);
endmodule
但为什么不使用逐位运算符?似乎更简单。
module yAdder1(z, cout, a, b, cin);
output[0:0] z, cout;
input[0:0] a, b, cin;
assign z = (a ^ b) ^ cin;
assign cout = (a & b) | ((a ^ b) & cin);
endmodule
除非逐位运算符隐式使用原始模块?
答案 0 :(得分:1)
内置基元是在门级模型中表达门的便捷方式。通常它们是由其他工具生成的。除此之外,没有太多理由在普通的verilog中使用它们。
可能很少有它们可以运行,主要是各种三态缓冲器可用于驱动总线。但是所有其他人并没有那么多。
并且没有它们不会在模拟中隐式使用。
答案 1 :(得分:0)
它只是一种不同的写作verilog的风格。前者采用结构形式,后者更倾向于行为/功能格式。
添加@ Serge的观点,如果你试图单独合成它们,你会看到一个非常相似(可能完全相同)的网表。 以结构方式编写代码将减轻综合工具将RTL映射到现有基元(在特征库中)的努力 - 缺点是难以理解查看结构代码的功能。