我无法在文本文件中获得正确的输出,但是在modelsim中模拟是相当不错的。但是当把它写到文本文件时,我每次输入都会得到XX。可能存在一些语法错误或其他错误。如果有帮助,请写下测试工作台,用于写入触发器(例如)的dout (输出),每个dout(输出)都显示在文本文件中的新行中。
代码:
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;
endmoduleTestbench:
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发布于 2014-09-02 14:53:44
我希望您考虑以下代码部分:
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。
如果这样做是有效的,因为不能保证在写入之前文件会被打开,那么您甚至在重置模拟逻辑之前就在时间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次循环。
您的测试程序由两个并行工作的initial begins组成,而不是由一个顺序执行的程序组成。您没有延迟地写出您的文本文件,并且您编写了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
endmodulehttps://stackoverflow.com/questions/25607124
复制相似问题