
verilog高手帮我看下这段代码有什么问题
要求是输入两个4位无符号数,计算它们的乘积modulemult_4bit(clk,x,y,result);inputclk;input[3:0]x,y;output[7:...
要求是输入两个4位无符号数,计算它们的乘积
module mult_4bit(clk,x,y,result);
input clk;
input [3:0] x,y;
output [7:0] result;
wire [3:0] sum;
reg [7:0] result;
reg [2:0] cnt;
addr_4bit A1(x,result[7:4],sum);
always @(x,y)
cnt=0;
always @(posedge clk)
begin
if(cnt==0)
result[7:0]=y;
if(cnt!=3'b100)
begin
if(result[0]==1)
result[7:4]=sum;
result=result>>1;
cnt=cnt+1;
end
end
endmodule
module addr_4bit(a,b,sum);
input [3:0] a,b;
output [3:0] sum;
assign sum[0]=a[0]^b[0];
assign sum[1]=a[1]^b[1]^(a[0]&b[0]);
assign sum[2]=a[2]^b[2]^((a[1]&b[1])|(a[1]&(a[0]&b[0]))|(b[1]&(a[0]&b[0])));
assign sum[3]=a[3]^b[3]^((a[2]&b[2])|(a[2]&((a[1]&b[1])|(a[1]&(a[0]&b[0]))|(b[1]&(a[0]&b[0]))))|(b[2]&((a[1]&b[1])|(a[1]&(a[0]&b[0]))|(b[1]&(a[0]&b[0])))));
endmodule
以上的编译能过,但是运行结果乱七八糟,其中那个加法模块单独验证过没有问题,求指点 展开
module mult_4bit(clk,x,y,result);
input clk;
input [3:0] x,y;
output [7:0] result;
wire [3:0] sum;
reg [7:0] result;
reg [2:0] cnt;
addr_4bit A1(x,result[7:4],sum);
always @(x,y)
cnt=0;
always @(posedge clk)
begin
if(cnt==0)
result[7:0]=y;
if(cnt!=3'b100)
begin
if(result[0]==1)
result[7:4]=sum;
result=result>>1;
cnt=cnt+1;
end
end
endmodule
module addr_4bit(a,b,sum);
input [3:0] a,b;
output [3:0] sum;
assign sum[0]=a[0]^b[0];
assign sum[1]=a[1]^b[1]^(a[0]&b[0]);
assign sum[2]=a[2]^b[2]^((a[1]&b[1])|(a[1]&(a[0]&b[0]))|(b[1]&(a[0]&b[0])));
assign sum[3]=a[3]^b[3]^((a[2]&b[2])|(a[2]&((a[1]&b[1])|(a[1]&(a[0]&b[0]))|(b[1]&(a[0]&b[0]))))|(b[2]&((a[1]&b[1])|(a[1]&(a[0]&b[0]))|(b[1]&(a[0]&b[0])))));
endmodule
以上的编译能过,但是运行结果乱七八糟,其中那个加法模块单独验证过没有问题,求指点 展开
2个回答
展开全部
你要用的是调用模块,还是调用task呀?
addr_4bit A1(x,result[7:4],sum);你写的这个像是调用task
但是根据你上面的做法,你想要的是调用模块addr_4bit。
所以你有两个选择,要么把下面那个module addr_4bit改成task。要么就把addr_4bit A1(x,result[7:4],sum);改成调用模块形式
addr_4bit A1(x,result[7:4],sum);你写的这个像是调用task
但是根据你上面的做法,你想要的是调用模块addr_4bit。
所以你有两个选择,要么把下面那个module addr_4bit改成task。要么就把addr_4bit A1(x,result[7:4],sum);改成调用模块形式
追问
我初学,还不知道task什么的,调用模块不是这么写的吗?
追答
1.定义任务task的语法如下:
task;
endtask
2.任务调用:
(端口1,端口2,...,端口n);
3.调用模块
例如 module half_clk(rest,clk_in,clk_out);
input clk_in,reset;
output clk_out;
....
endmodule
测试模块(就要调用这个模块时):
module top;
reg clk,rst;
wire clk_out;
...
half_clk m(.reset(rst),.clk_in(clk),.clk_out(clk_out));这就是调用模块half_clk,端口要对应起来
endmodule
2011-04-09
展开全部
if(cnt==0)
result[7:0]=y;
if(cnt!=3'b100)
这两个 if不构成分支关系 ?
result[7:0]=y;
if(cnt!=3'b100)
这两个 if不构成分支关系 ?
追问
不分支呀,第一个只在cnt=0做一次,第二个在cnt=0到11一共做4次
追答
always块里的阻塞赋值的问题 ?
我也没仔细看,前面是我弄错了 不好意思
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询