for循环工作正常,但一切都在一个时钟周期内发生。我如何让它在每个周期运行一次迭代?
`timescale 1ns/10ps
module multiplier (clock,multiplier,multiplicand,start,done,product);
input [7:0] multiplier ,multiplicand;
input start;
input clock;
output [15:0] product;
output done;
reg [15:0] multiplierF ,multiplicandF;
reg [15:0] productF;
reg doneF;
integer i;
assign product = productF;
assign done = doneF;
task rpa_16;
input [15:0] multiplierF;
inout [15:0] productF;
assign productF = multiplierF + productF;
endtask
always @ (posedge clock or posedge start)
begin
if(start)
begin
multiplierF = 0 ;
multiplicandF = 0 ;
productF = 0 ;
doneF = 0 ;
end
else
begin
multiplierF = {8'b0,multiplier};
multiplicandF = {8'b0,multiplicand};
end
end
always @(posedge clk)
begin
if(!doneF)
begin
for (i=0;i<7;i=i+1)
begin
if(multiplicand[i])
begin
rpa_16(multiplierF,productF);
multiplierF = multiplierF << 1;
productF = productF;
end
else
begin
multiplierF = multiplierF << 1;
end
end
doneF = 1;
end
end
答案 0 :(得分:4)
我无法粘贴波形图片,但我想在每个正边缘后增加。但是发生的事情是,for循环在一个时钟周期内执行,我得到了输出。
对于循环,并不意味着在verilog中有任何顺序。如果你想要一个需要8个时钟周期的循环,那么你将不得不用一个明确的计数器变量重写它,可能是这样的:
always @(posedge clk or negedge reset_)
if(!reset_) begin
multiplierF <= 0;
loopcount <= 0;
doneF <= 0;
end else begin
if(!doneF) begin
loopcount <= loopcount + 1;
if(multiplicand[loopcount]) begin
rpa_16(multiplierF,productF);
multiplierF = multiplierF << 1;
productF = productF;
end else begin
multiplierF = multiplierF << 1;
end
end
if(loopcount == 7) doneF <= 1;
end
此外,您不应该在多个always块中分配multiplierF
之类的变量,您将获得非确定性行为并且可能无法合成。在posedge clk上,两个块都将执行,你不知道哪个块最后会执行,所以它可能会在不同的模拟器上给出不同的结果。