//File output with multi-channel descriptor
module test;
integer handle1,handle2,handle3; //file handles
//open files
initial
begin
handle1 = $fopen("f1.out");
handle2 = $fopen("f2.out");
handle3 = $fopen("f3.out");
end
//Display statements to files
initial
begin
//File output with multi-channel descriptor
#5;
$fdisplay(4, "Display Statement # 1");
$fdisplay(15, "Display Statement # 2");
$fdisplay(6, "Display Statement # 3");
$fdisplay(10, "Display Statement # 4");
$fdisplay(0, "Display Statement # 5");
end
endmodule
我一直在寻找这个问题的正确解释。我所知道的是,我必须从第一个“初始”区块开始 -
初始
开始
handle1 = $ fopen(“f1.out”); // 32'h 0000 0002
handle2 = $ fopen(“f2.out”); // 32'h 0000 0004
handle3 = $ fopen(“f3.out”); // 32'h 0000 0008
结束
在此之后,我不知道如何找到这些显示语句将写入的文件。需要知道如何解决这类问题。谢谢。
答案 0 :(得分:1)
每次调用$fopen
都会返回一个32位多通道描述符(mcd)。
根据Verilog LRM:
多通道描述符
mcd
是一个32位的reg,其中设置了一个指示打开哪个文件的位。 mcd的最低有效位(位0)始终指标准输出。输出被定向到两个或多个使用多通道描述符打开的文件,通过将它们的mcds按位OR运或写入结果值。
因此,在打开示例中的3个文件后,您可以通过执行以下操作将输出定向到多个文件:
$fdisplay(handle1 | handle2, "Write to f1.out and f2.out");
$fdisplay(handle1 | 32'h00000001, "Write to f1.out and stdout");
如果查看问题中传递给$fdisplay
的值,您应该能够确定哪些位被设置,以及哪些文件(包括stdout)将被写入。