我正在尝试编写一个测试平台,它将从文件读取和评估的所有值输出到文本文件中。但我只能在输出文件中获得1行而不是32行。有人可以解释一下吗?
`timescale 100ns/1ps
module multtest;
reg clk,reset;
reg signed [7:0] a, b;
reg signed [15:0] result,res;
integer fread, fw;
reg [7:0] in_a, in_b;
reg [47:0] in_r;
wire signed[15:0] result1;
mult mult_0 (.clk(clk) , .reset(reset), .A(a), .B(b), .result(result1));
initial
begin
fread = $fopen ("goldenresult","r");
fw = $fopen ("goldresult.txt","w");
clk = 1'b0;
reset = 1'b1;
#200;
reset = 1'b0;
#200;
reset = 1'b1;
end
always
#2.5 clk = ~clk;
//conditon for reset
always @ (reset == 1'b1)
begin
a <= 0;
b <= 0;
result <= 0;
end
always @(posedge clk)
begin
//Verifying the result when testmode = 0 and reset = 0
if (reset == 1'b0)
begin
while ($fscanf(fread, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, result) != 6) begin end
$display ("a = %b, b = %b, result = %b", a, b, result);
end
end
/*always @(posedge clk)
@(negedge reset)
if (reset == 1'b0)
begin
while ($fscanf(fread, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, result) != 6) begin end
$fwrite(fw, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, res);
end*/
endmodule
我已经注释掉了应该编写的代码部分。我做错了什么。输出采用以下格式:
a = 10111010,b = 00111011,结果= 0000000000000000
它应该写入所有32行,而只写1.但它正确地显示了modelsim中的输出。
答案 0 :(得分:0)
这是行fw = $fopen ("goldresult.txt","w");
创建用于写入的新文件或将其截断为零长度。因此,在您调用$fwrite(fw, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, res);
函数的情况下,每次重写时都要重写。
要添加新值,您需要使用其他模式fa = $fopen ("goldresult.txt","a+");
a + (用于追加;在文件末尾打开或创建更新)
在代码中看起来像:
fa = $fopen ("goldresult.txt","a+");
$fwrite(fa, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, res);
并且不要忘记关闭文件$fclose(fa);
答案 1 :(得分:0)
问题在于你正在进行while循环。在while循环行的末尾,您有begin end
。这意味着在while循环中发生的唯一事情就是正在测试的条件($fscanf
)。您还希望$fwrite
位于while循环中,因此您需要在写入后放置end
。
另一个问题是,您正在测试!= 6
,而应该在== 6
时继续使用while循环。
您还说过在每次输出后都想要回车,因此您应该使用$fdisplay
代替$fwrite
。它们之间的唯一区别是包含回车。
while ($fscanf(fread, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, result) == 6) begin
$fdisplay(fw, "%s = %b, %s = %b, %s = %b", in_a, a, in_b, b, in_r, res);
end