此代码描述了这个表达式 - > (a+b)(c+d)
。我使用了2个加法器,首先求和a和b,然后是c和d。然后另一个增加结果。不幸的是,我在Verilog工作非常糟糕,所以我无法理解错误。
module automate(a,b,c,d,clk,start,result,ready);
parameter n=8;
input [7:0] a,b,c,d;
input start,clk;
output reg[17:0] result;
output reg ready;
reg[7:0] ra;
reg[7:0] rb;
reg[7:0] rc;
reg[7:0] rd;
reg[8:0] sm1;
reg[8:0] sm2;
reg[8:0] acc,q;
always@(posedge start)
begin
ra=a;
rb=b;
rc=c;
rd=d;
sm1=ra+rb;
sm2=rc+rd;
q=sm2;
acc=0;
ready=0;
repeat(9)
begin
@(posedge clk)
if(q[0])
acc=acc+sm1;
else
acc=acc;
q=q>>1;
q[8] = acc[0];
acc=acc>>1;
end
ready=1;
result={acc[8:0],q};
end
endmodule
Testbench:
module test_bench;
reg[7:0] a,b,c,d;
reg clk,start;
wire ready;
wire[17:0] result;
automate res(a,b,c,d,clk,start,result,ready);
initial begin
start = 0;
clk=0;
a=8'd7;
b=8'd5;
c=8'd9;
d=8'd3;
#30 start = 1;
wait(ready);
#20 start = 0;
#500 $finish;
end
always #10 clk=~clk;
endmodule
但是我得到的是:
答案 0 :(得分:0)
根据@Matthew Taylor !!你的代码工作正常,
模拟可能不是TB,因为它是顶层模块, 没有任何东西被驱动到DUT 所以你的信号是X
和{{1} }。
Z
然后运行它,您将看到输出如下,
.....
automate res(a,b,c,d,clk,start,result,ready);
initial begin
$monitor (result, res.sm1, res.sm2); // added monitor system task
start = 0;
.....
尽管如此,我想说,你正在编写HDL代码,一个真正的硬件,所以不要使用# x x x
# x 12 12
# 144 12 12
,使用 进行 循环。
如果您的要求只是repeat
,则不会使用时钟。
另外,
(A+B) / (C+D)
对于将 always@(*)
begin
ra = 0;
rb = 0;
rc = 0;
sm1 = 0;
sm2 = 0;
result = 0;
if(start) begin
ra = a;
rb = b;
rc = c;
rd = d;
sm1 = ra + rb;
sm2 = rc + rd;
result = product(sm1, sm2);
end
end
和product
相乘的函数sm1
,
sm2
所以我认为开始和准备将在同一周期断言。截至目前,您的代码中没有顺序逻辑。
希望这会对你有所帮助。
编辑:
对于您的第二个问题,请使用以下脚本命令:
function [17:0] product;
input [8:0] multiplier, multiplicand;
integer i;
begin
product = 0;
for(i=0; i<17; i=i+1)
if( multiplier[i] == 1'b1 )
product = product + ( multiplicand << i );
end
endfunction