Verilog:使用原始模块与逐位运算符的实现

时间:2017-06-30 20:58:17

标签: verilog iverilog

我阅读的教科书使用内置的原始模块实现了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

除非逐位运算符隐式使用原始模块?

2 个答案:

答案 0 :(得分:1)

内置基元是在门级模型中表达门的便捷方式。通常它们是由其他工具生成的。除此之外,没有太多理由在普通的verilog中使用它们。

可能很少有它们可以运行,主要是各种三态缓冲器可用于驱动总线。但是所有其他人并没有那么多。

并且没有它们不会在模拟中隐式使用。

答案 1 :(得分:0)

它只是一种不同的写作verilog的风格。前者采用结构形式,后者更倾向于行为/功能格式。

添加@ Serge的观点,如果你试图单独合成它们,你会看到一个非常相似(可能完全相同)的网表。 以结构方式编写代码将减轻综合工具将RTL映射到现有基元(在特征库中)的努力 - 缺点是难以理解查看结构代码的功能。