0

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

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

4

2 回答 2

1

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

您可以遇到的可能很少,主要是各种可用于驾驶公共汽车的三态缓冲器。但所有其他人都没有那么多使用。

,它们不会在模拟中隐式使用。

于 2017-07-01T00:18:21.790 回答
0

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

补充@Serge的观点,如果您尝试单独合成它们中的每一个,您会看到一个非常相似(可能完全相同)的网表。以结构化方式编写代码将减轻综合工具将 RTL 映射到现有原语(在特征库中)的工作 - 缺点是难以理解查看结构化代码的功能。

于 2017-07-01T07:50:32.890 回答