设计并实现加法器类Adder
Posted qian-heng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计并实现加法器类Adder相关的知识,希望对你有一定的参考价值。
定义一个整数加法器类Adder,对其重载运算符“+”、“++”,main(void)函数完成对其的测试。
Adder类结构说明:
Adder类的数据成员包括:
①私有数据成员:数值域num(int型)。
Adder类成员函数包括:
①有参构造函数Adder(int)和拷贝构造函数Adder(const Adder &),其中有参构造函数参数默认值为0,输出信息“Adder Constructor run”,拷贝构造函数输出信息“Adder CopyConstructor run”
②析构函数,析构函数输出信息“Adder Destructor run”
③公有函数成员void setNum(int)和int getNum() const分别返回和设置数值域。
④重载“+”运算符,实现两个Adder对象相加的运算
⑤重载“++”运算符,实现Adder对象自增运算
⑥公有成员函数void show() const用于显示加法器的信息,显示格式为:Adder(<数值域>)
裁判测试程序样例:
#include <iostream>
using namespace std;
/*请在这里填写答案*/
//主函数
int main(void)
int x;
Adder a1,a2(a1);
cin>>x;
(a1++).show();
a1.show();
a2.setNum(x);
(++a2).show();
a2.show();
(a1+a2).show();
return 0;
输入样例:
1
输出样例:
Adder Constructor run Adder CopyConstructor run Adder CopyConstructor run Adder(0) Adder Destructor run Adder(1) Adder(2) Adder(2) Adder Constructor run Adder(3) Adder Destructor run Adder Destructor run Adder Destructor run
daima:
class Adder
private:
int num;
public:
Adder(int n=0);
Adder(const Adder &P);
~Adder();
void setNum(int n1);
int getNum() const;
void show() const;
Adder operator+(Adder &a2);
Adder& operator++();
Adder operator++(int);
;
Adder::Adder(int n)
num=n;
cout<<"Adder Constructor run"<<endl;
Adder::Adder(const Adder &P)
num=P.num;
cout<<"Adder CopyConstructor run"<<endl;
Adder::~Adder()
cout<<"Adder Destructor run"<<endl;
void Adder::setNum(int n1)
num=n1;
int Adder::getNum() const
return num;
Adder Adder::operator+(Adder &a2)
return Adder(num+a2.num);
Adder& Adder::operator++()
++num;
return *this;
Adder Adder::operator++(int)
Adder a=*this;
++(*this);
return a;
void Adder::show() const
cout<<"Adder"<<"("<<num<<")"<<endl;
在 topmodule 中制作子模块会导致验证器错误 [关闭]
【中文标题】在 topmodule 中制作子模块会导致验证器错误 [关闭]【英文标题】:Making submodule in topmodule results in verilator error [closed] 【发布时间】:2019-02-28 15:34:13 【问题描述】:我刚开始学习 Verilog,并决定制作一个 4 位加法器。为了创建这个 4 位加法器,我首先构建了一个 half_adder 模块,然后是一个使用 half_adder 模块的 full_adder 模块。在 4 位加法器中,我使用了 4 个 full_adder 模块。 到目前为止,一切都使用 Verilator 编译和模拟。我编写了一些测试并检查了所有输出是否正确。
在完成 4 位加法器之后,我想创建一个使用 4 位加法器进行加法的小型 ALU。现在,当我在 ALU 模块中创建 4 位加法器的子模块时,出现验证器错误。
4 位加法器如下所示:
`default_nettype none
module adder_4_bit(
i_a,
i_b,
o_sum,
o_carry
);
input [3:0] i_a;
input [3:0] i_b;
output [3:0] o_sum;
output wire o_carry;
wire internal_carry1;
wire internal_carry2;
wire internal_carry3;
full_adder full_adder1(
.i_a ( i_a[0] ),
.i_b ( i_b[0] ),
.i_carry ( 1'b0 ),
.o_sum ( o_sum[0] ),
.o_carry ( internal_carry1 )
);
full_adder full_adder2(
.i_a ( i_a[1] ),
.i_b ( i_b[1] ),
.i_carry ( internal_carry1 ),
.o_sum ( o_sum[1] ),
.o_carry ( internal_carry2 )
);
full_adder full_adder3(
.i_a ( i_a[2] ),
.i_b ( i_b[2] ),
.i_carry ( internal_carry2 ),
.o_sum ( o_sum[2] ),
.o_carry ( internal_carry3 )
);
full_adder full_adder4(
.i_a ( i_a[3] ),
.i_b ( i_b[3] ),
.i_carry ( internal_carry3 ),
.o_sum ( o_sum[3] ),
.o_carry ( o_carry )
);
endmodule
ALU(目前)看起来像这样。我仍然需要实现 optcode 选择等,但即使创建 4 位加法器子模块也已经导致错误...:
`default_nettype none
module alu_4_bit(
i_a,
i_b,
i_opt,
o_result,
o_status
);
input [3:0] i_a;
input [3:0] i_b;
input [3:0] i_opt;
output [3:0] o_result;
output [4:0] o_status;
adder_4_bit adder_4_bit_inst(
.i_a(i_a),
.i_b(i_b),
.o_sum(o_result),
.o_carry(o_status[0])
);
endmodule
运行命令时
verilator -Wall -cc alu_4_bit.v
我收到以下错误:
verilator -Wall -cc alu_4_bit.v
%Error: adder_4_bit:5: Unterminated string
%Error: adder_4_bit:11: Unterminated string
%Error: adder_4_bit:27: Unterminated string
%Error: adder_4_bit:28: Unterminated string
%Error: adder_4_bit:31: Unterminated string
%Error: adder_4_bit:40: Unterminated string
%Error: adder_4_bit:44: Unterminated string
%Error: adder_4_bit:58: Unterminated string
%Error: adder_4_bit:60: Unterminated string
%Error: adder_4_bit:66: Unterminated string
%Error: adder_4_bit:70: Unterminated string
%Error: adder_4_bit:72: Unterminated string
%Error: adder_4_bit:78: Unterminated string
%Error: adder_4_bit:79: Unterminated string
%Error: adder_4_bit:81: Unterminated string
%Error: adder_4_bit:86: Unterminated string
%Error: adder_4_bit:93: Unterminated string
%Error: adder_4_bit:119: Unterminated string
%Error: adder_4_bit:121: Unterminated string
%Error: adder_4_bit:124: Unterminated string
%Error: adder_4_bit:131: Unterminated string
%Error: adder_4_bit:132: Unterminated string
%Error: adder_4_bit:133: Unterminated string
%Error: adder_4_bit:134: Unterminated string
%Error: adder_4_bit:135: Unterminated string
%Error: adder_4_bit:139: Unterminated string
%Error: adder_4_bit:141: Unterminated string
%Error: adder_4_bit:143: Unterminated string
%Error: adder_4_bit:144: Unterminated string
%Error: adder_4_bit:146: Unterminated string
%Error: adder_4_bit:148: Unterminated string
%Error: adder_4_bit:150: Unterminated string
%Error: adder_4_bit:157: Unterminated string
%Error: adder_4_bit:160: Unterminated string
%Error: adder_4_bit:162: Unterminated string
%Error: adder_4_bit:164: Unterminated string
%Error: adder_4_bit:165: Unterminated string
%Error: adder_4_bit:1: syntax error, unexpected $undefined
%Error: Exiting due to 38 error(s)
%Error: Command Failed /usr/local/bin/verilator_bin -Wall -cc alu_4_bit.v
奇怪的是这些错误似乎来自adder_4_bit.v,而我已经用verilator编译和模拟了它。我什至确保它正常工作。
这可能是什么问题?
【问题讨论】:
【参考方案1】:当我尝试用 verilator 编译它时,我没有收到这样的警告,但是我收到了一些其他警告:
alu_4_bit.v:12: Signal is not used: i_opt
我在模块 I/O 中注释掉了 input[3:0] i_opt
和 i_opt 的定义,然后我收到了这个警告。
%Error: alu_4_bit.v:20: Illegal bit or array select; type does not have a bit range, or bad dimension: type is logic
我用output o_status
替换了output[3:0] o_status
,并从.o_carry(o_status[0])
中删除了位选择,现在它是.o_carry(o_status)
。
在这些之后,设计用我的版本(4.004)的verilator编译。我希望这些对你也有帮助。
【讨论】:
感谢您澄清它确实可以编译并且问题不在verilog代码中。我运行验证器版本 4.010。因为问题不在verilog代码中,所以我尝试将所有代码移动到不同的目录,这解决了我的问题!我试图编译的目录,已经有以前编译过的代码,这可能是干扰?以上是关于设计并实现加法器类Adder的主要内容,如果未能解决你的问题,请参考以下文章
在 topmodule 中制作子模块会导致验证器错误 [关闭]
Coding for Quantum Computing: Creating an Adder Circuit