Binary 2位有符号乘法器

Binary 2位有符号乘法器,binary,verilog,system-verilog,signed,Binary,Verilog,System Verilog,Signed,使用4位加法器的一个实例设计一个2位有符号乘法器。请记住,您需要将两个2位输入扩展到完整的4位 这是我的任务,我提出了以下代码,但我的一些输出是错误的。谁能告诉我我做错了什么 模块mult(C,A,B); 输出符号为[3:0]C; 输入符号[1:0]A,B; reg签署[3:0]sA,sB; 分配sA={A[1],A[1],A}; 赋值sB={B[1],B[1],B}; 钢丝运输; 署名为[3:0]A1的电线; 签署[3:0]A2的电报; 签署为[3:0]sum0的电线; 和(A1[0],sA[

使用4位加法器的一个实例设计一个2位有符号乘法器。请记住,您需要将两个2位输入扩展到完整的4位

这是我的任务,我提出了以下代码,但我的一些输出是错误的。谁能告诉我我做错了什么

模块mult(C,A,B);
输出符号为[3:0]C;
输入符号[1:0]A,B;
reg签署[3:0]sA,sB;
分配sA={A[1],A[1],A};
赋值sB={B[1],B[1],B};
钢丝运输;
署名为[3:0]A1的电线;
签署[3:0]A2的电报;
签署为[3:0]sum0的电线;
和(A1[0],sA[0],sB[0]);
和(A1[1],sA[1],sB[0]);
和(A1[2],sA[2],sB[0]);
和(A1[3],sA[3],sB[0]);
分配A2[0]=0;
和(A2[1],sA[0],sB[1]);
和(A2[2],sA[1],sB[1]);
和(A2[3],sA[2],sB[1]);
加法器4位a1(.A(a1),.B(A2),.Co(进位),.sum(sum0));
分配C[0]=sum0[0];
分配C[1]=sum0[1];
赋值C[2]=sum0[2];
赋值C[3]=sum0[3];
端模
模块加法器4位(A、B、和、Co);
输入符号[3:0]A,B;
输出有符号[4:0]和;
注册签名[4:0]a,b;
输出Co;
铁丝网;
分配Ci=1'b0;
分配a={a[3],a};
赋值b={b[3],b};
faa0(.A(A[0]),.B(B[0]),.Ci(Ci),.sum(sum[0]),.Co(w1));
faa1(.A(A[1]),.B(B[1]),.Ci(w1),.sum(sum[1]),.Co(w2));
faa2(.A(A[2]),.B(B[2]),.Ci(w2),.sum(sum[2]),.Co(w3));
faa3(.A(A[3]),.B(B[3]),.Ci(w3),.sum(sum[3]),.Co(w4));
faa4(.A(A[4]),.B(B[4]),.Ci(w4),.sum(sum[4]),.Co(Co));
端模
模块FA(A、B、Ci、Co、sum);
输入A、B、Ci;
输出和,Co;
分配总和=(A^B)^Ci;
分配Co=(B&Ci)|(A&Ci)|(A&B);
端模

有些信号声明为
reg
连接到端口输出,
reg
必须在程序块中分配

我还将加法器中的进位设置为显式
wire
向量,而不是多个隐式wire。隐式连接是危险的,输入错误会导致断开连接

此外,我还声明乘法器中的
sum0
与所连接的
sum
端口的输出具有相同的宽度,即使不使用位4

就逻辑而言,您只犯了一个错误,
A*B=A*B[0]-2*A*B[1]
而不是
A*B[0]+2*B[1]
如果
B
是一个2位有符号整数。因为
B[1]
是符号位,因此
B=B[0]-2*B[1]
。我通过在端口连接中直接使用一元
-
修复了这个问题,我将让您从结构上编写它

模块mult(C,A,B);
输出符号为[3:0]C;
输入符号[1:0]A,B;
电文签名[3:0]sA,sB;
分配sA={A[1],A[1],A};
赋值sB={B[1],B[1],B};
钢丝运输;
署名为[3:0]A1的电线;
签署[3:0]A2的电报;
签署为[4:0]sum0的电汇;
和(A1[0],sA[0],sB[0]);
和(A1[1],sA[1],sB[0]);
和(A1[2],sA[2],sB[0]);
和(A1[3],sA[3],sB[0]);
分配A2[0]=0;
和(A2[1],sA[0],sB[1]);
和(A2[2],sA[1],sB[1]);
和(A2[3],sA[2],sB[1]);
//FIXME:注意,我通过了-A2,模拟器将
//自动消除信号。也许是为了你的任务
//您需要使用逻辑原语来扩展它。。。
加法器4位a1(.A(a1),.B(-A2),.Co(进位),.sum(sum0));
分配C[0]=sum0[0];
分配C[1]=sum0[1];
赋值C[2]=sum0[2];
赋值C[3]=sum0[3];
端模
模块加法器4位(A、B、和、Co);
输入符号[3:0]A,B;
输出有符号[4:0]和;
电文签名[4:0]a,b;
输出Co;
金属丝[4:1]w;
铁丝网;
分配Ci=1'b0;
分配a={a[3],a};
赋值b={b[3],b};
faa0(.A(A[0]),.B(B[0]),.Ci(Ci),.sum(sum[0]),.Co(w[1]);
faa1(.A(A[1]),.B(B[1]),.Ci(w[1]),.sum(sum[1]),.Co(w[2]);
faa2(.A(A[2]),.B(B[2]),.Ci(w[2]),.sum(sum[2]),.Co(w[3]);
faa3(.A(A[3]),.B(B[3]),.Ci(w[3]),.sum(sum[3]),.Co(w[4]);
faa4(.A(A[4]),.B(B[4]),.Ci(w[4]),.sum(sum[4]),.Co(Co));
端模
模块FA(A、B、Ci、Co、sum);
输入A、B、Ci;
输出和,Co;
分配总和=(A^B)^Ci;
分配Co=(B&Ci)|(A&Ci)|(A&B);
端模

它有助于解释什么是错的,什么应该是对的。