gpt4 book ai didi

verilog - 用于将 verilog 输出写入文本文件的测试台

转载 作者:行者123 更新时间:2023-12-02 14:17:37 26 4
gpt4 key购买 nike

我无法在文本文件中获得正确的输出,但是 modelsim 中的模拟相当不错..但是在将其写入文本文件时,我为每个输入都得到了 XX。可能存在一些语法错误或其他错误。如果有的话可以帮助请写下用于编写触发器的 doout(输出)(作为示例)的测试平台,其中每个 doout(输出)都显示在文本文件的新行中。

代码:

module LFSR( clk,reset,out);
parameter width =4;
input clk,reset;
output [width-1:0] out ;
reg [width-1:0] lfsr;

integer r;
wire feedback = lfsr[width-1]^lfsr[width-2];


always @(posedge clk)
if (reset)
begin
lfsr <= 4'b1000;
end
else
begin
lfsr[0] <= feedback;
for(r=1;r<width;r=r+1)
lfsr[r]<=lfsr[r-1];
end

assign out=lfsr;
endmodule

测试平台:

module aaatest();

parameter width =4;
reg clk,reset;
wire [width-1:0] out;
reg [width-1:0] lfsr[13:0];
integer f,i;

initial
begin
f = $fopen("output.txt","w");
end

LFSR patt (clk,reset,out);

always #5 clk=~clk;

initial begin
clk=1; reset=1;
#10 reset=0;
# 140 $stop;
end

initial
begin
clk=1;
for (i = 0; i<14; i=i+1)
@(posedge clk)
lfsr[i]<= out;
end

initial begin
for (i = 0; i<14; i=i+1)
$fwrite(f,"%b\n",lfsr[i]);
end

initial begin
$display("clk out");
$monitor("%b,%b", clk, out);
end

initial
begin
$fclose(f);
end
endmodule

最佳答案

我希望您考虑一下这些代码部分:

initial begin
f = $fopen("output.txt","w");
end

initial begin
for (i = 0; i<14; i=i+1)
$fwrite(f,"%b\n",lfsr[i]);
end

initial begin
$fclose(f);
end

在描述硬件时,我们有一个大规模并行模拟。所有首字母都应同时开始,即时间 0。

如果这完全有效,因为无法保证文件在写入之前会被打开,那么您甚至在重置模拟逻辑之前就在零时间写入文件。

像下面这样的东西可能更合适:

initial begin
f = $fopen("output.txt","w");

@(negedge reset); //Wait for reset to be released
@(posedge clk); //Wait for fisrt clock out of reset

for (i = 0; i<14; i=i+1) begin
$fwrite(f,"%b\n",lfsr[i]);
end

$fclose(f);
end

要跟进 Gregs 建议,过早发布重置,请考虑类似以下内容:

initial begin
clk=0; reset=1; //Clock low at time zero
@(posedge clk);
@(posedge clk);
reset=0;
# 140 $stop;
end

在 2 个时钟上升沿保持复位有效。

更新工作示例

发生了一些奇怪的事情,您在 #140 之后调用 $stop (不是 $finish),但也尝试循环 14 $stop 表示只执行 4 个循环。

您的测试程序由 2 个并行工作的初始开始组成,而不是由一个顺序执行的程序组成。您在写出文本文件时没有任何延迟,并且编写了 lfsr 的缓冲版本,而不是直接编写 lfsr 输出。

以下示例正确模拟并写入您要查找的文本文件:

module aaatest();

parameter width =4;
reg clk,reset;
wire [width-1:0] out;
reg [width-1:0] lfsr[13:0];
integer f,i;

LFSR patt (clk,reset,out);

always #5 clk=~clk;

//Clock and reset release
initial begin
clk=0; reset=1; //Clock low at time zero
@(posedge clk);
@(posedge clk);
reset=0;
end

initial begin
f = $fopen("output.txt","w");

@(negedge reset); //Wait for reset to be released
@(posedge clk); //Wait for fisrt clock out of reset

for (i = 0; i<14; i=i+1) begin
@(posedge clk);
lfsr[i] <= out;
$display("LFSR %b", out);
$fwrite(f,"%b\n", out);
end

$fclose(f);

$finish;
end
endmodule

关于verilog - 用于将 verilog 输出写入文本文件的测试台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25607124/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com