我对Verilog很陌生,并试图通过编写我工作所需的DSP模块来学习。
我正在尝试将子模块的变量写入txt / m文件以在matlab中使用。
顶部块是TB,子模块实例名为“sync_short_inst”,如下所示:
我在三个不同的文件中写了三个变量:顶部块中的两个变量和子模块中的一个变量,在此线程的末尾复制。
我在从文件中的子模块写入变量时遇到问题。代码编译没有错误但是当我运行模拟时,我得到错误,我没有在文件中得到任何东西。当我评论第三个$ fwrite时,模拟没有问题,但第三个$ fwrite会产生以下错误。
如果有人可以建议我如何解决问题,我将不胜感激。
`timescale 1ns / 1ps
module TB( );
`include "common_params.v"
reg clock;
reg reset;
reg enable;
reg set_stb;
reg [7:0] set_addr;
reg [31:0] set_data;
reg signed [31:0] data_in;
reg input_strobe;
wire short_preamble_detected;
// RAM
//localparam RAM_SIZE = 1<<132;
reg [31:0] FileData [0:10000]; // 10000 words of size 32
reg [31:0] addr1;
integer fID_i, fID_q, fID_mag_sq_av;
`define SAMPLE_FILE "SampleFile.txt"
sync_short sync_short_inst(
.clock(clock),
.reset(reset),
.enable(enable),
.set_stb(set_stb),
.set_addr(set_addr),
.set_data(set_data),
.sample_in(data_in),
.sample_in_strobe(input_strobe),
.short_preamble_detected(short_preamble_detected)
);
initial
begin
$display("Reading memory from...");
$display(`SAMPLE_FILE);
$readmemh(`SAMPLE_FILE, FileData);
$display("Done.");
clock = 1'b0;
reset = 1'b1;
enable = 1'b0;
input_strobe = 1'b0;
# 20
reset = 1'b0;
enable = 1'b1;
set_stb = 1;
# 20
set_addr = SR_SKIP_SAMPLE; // do not skip sample
set_data = 0;
input_strobe = 1'b1;
# 20 input_strobe = 1'b0;
# 20 input_strobe = 1'b1;
end
always @(posedge clock)
begin
if (reset)
begin
data_in <= 0;
input_strobe <= 0;
addr1 <= 0;
end
else if (enable & input_strobe)
begin
data_in <= FileData[addr1];
addr1 <= addr1 + 'd1;
$fwrite(fID_i,$signed(TB.data_in[31:16]),"\n");
$fwrite(fID_q,$signed(TB.data_in[15:0]),"\n");
//$fwrite(fID_mag_sq_av,$signed(TB.sync_short_inst.clock),"\n");
$display($signed(TB.sync_short_inst.clock));
end
end
always #5 clock = !clock;
initial
begin
fID_i =$fopen("IO_Files/file_i.m"); $fwrite(fID_i,"x=0; z=0; i=[... \n");
fID_q =$fopen("IO_Files/file_q.m"); $fwrite(fID_q,"x=0; z=0; q=[... \n");
fID_mag_sq_av= $fopen("IO_Files/file_mag_sq_av.m"); $fwrite(fID_mag_sq_av,"x=0; z=0; i=[... \n");
#80000
$fwrite(fID_i,"]; clear x, clear z");
$fwrite(fID_q,"]; clear x, clear z");
$fwrite(fID_mag_sq_av,"]; clear x, clear z");
$fclose(fID_i);
$fclose(fID_q);
$fclose(fID_mag_sq_av);
end
endmodule
答案 0 :(得分:1)
我无法在您在Active 10.1上发布的代码或最新版本上重现您的问题。您需要发布可以重复的完整样本。
请与供应商技术支持联系以解决此问题。