这个怎么样?我正在寻找输出i + j = 1 + 2,2 + 3 ... 4 + 5。
module add(i,j,b);
input [31:0] i, j; //32 bit unsigned
output [31:0] y;
task ADD(i, j, y);
begin
for (i= 1; i <= 4; i++)
begin
for(j=2; j <= 5; j++)
assign y = i + j;
end
end
$display("y ", y);
endtask
endmodule
答案 0 :(得分:0)
这是用于合成吗?如果是这样,你应该避免使用任务,直到你知道什么时候可以使用它们。我从不在可合成代码中使用它们。
另一方面, function
通常用于合成但不包含时序信息。即一个函数只能代表组合逻辑,这一切都是瞬间发生的。
1)这不是你如何使用assign。正确的用法是:
wire [9:0] a;
assign a = 10'b0;
//or
//a,b both 10 bits driven from other logic
wire [9:0] sum;
assign sum = a + b;
请注意您如何分配电线,这是组合。
2)你的显示器在for
循环之外,它只会在结束时显示一次。
我会这样做:
module add(
input [31:0] a,
input [31:0] b,
output [31:0] sum
);
assign sum = a + b ;
endmodule
module testharness();
reg [31:0] a;
reg [31:0] b;
wire [31:0] sum;
reg clock;
// Make clock toggle every 10ns (20ns clock period)
initial begin
clock = 0;
forever begin
#10ns clock= ~clock;
end
end
//DUT (Device Under Test)
add add_0 (
.a ( a ),
.b ( b ),
.sum ( sum )
);
// Test program
initial begin
a=0;
b=0;
@(posedge clock);
$display( "a (%2d) + b (%2d) = sum (%2d)", a, b, sum );
a=1;
b=2;
@(posedge clock);
$display( "a (%2d) + b (%2d) = sum (%2d)", a, b, sum );
a=3;
b=4;
@(posedge clock);
$display( "a (%2d) + b (%2d) = sum (%2d)", a, b, sum );
$finish;
end
endmodule
请注意我们如何利用时间分隔结果,对于更复杂的设计,您可以使用触发器,这意味着您每个时钟只能获得一个新结果。或者,如果使用DDR技术,则按上升沿和下降沿。
您现在可以尝试修改测试程序部分,以根据您的要求激发DUT。