File io Verilog I/O读取字符
每当我尝试verilog的I/O时,我似乎都会遇到一些问题。Modelsim要么抛出某些函数不支持的函数,要么什么都不做。我只需要逐个字符读取文件,然后通过端口发送每个位。有人能帮忙吗File io Verilog I/O读取字符,file-io,io,verilog,modelsim,File Io,Io,Verilog,Modelsim,每当我尝试verilog的I/O时,我似乎都会遇到一些问题。Modelsim要么抛出某些函数不支持的函数,要么什么都不做。我只需要逐个字符读取文件,然后通过端口发送每个位。有人能帮忙吗 module readFile(clk,reset,dEnable,dataOut,done); parameter size = 4; //to Comply with S-block rules which is a 4x4 array will multiply by // size so row
module readFile(clk,reset,dEnable,dataOut,done);
parameter size = 4;
//to Comply with S-block rules which is a 4x4 array will multiply by
// size so row is the number of size bits wide
parameter bits = 8*size;
input clk,reset,dEnable;
output dataOut,done;
wire [1:0] dEnable;
reg dataOut,done;
reg [7:0] addr;
integer file;
reg [31:0] c;
reg eof;
always@(posedge clk)
begin
if(file == 0 && dEnable == 2'b10)begin
file = $fopen("test.kyle");
end
end
always@(posedge clk) begin
if(addr>=32 || done==1'b1)begin
c <= $fgetc(file);
// c <= $getc();
eof <= $feof(file);
addr <= 0;
end
end
always@(posedge clk)
begin
if(dEnable == 2'b10)begin
if($feof(file))
done <= 1'b1;
else
addr <= addr+1;
end
end
//done this way because blocking statements should not really be used
always@(addr)
begin:Access_Data
if(reset == 1'b0) begin
dataOut <= 1'bx;
file <= 0;
end
else if(addr<32)
dataOut <= c[31-addr];
end
endmodule
模块读取文件(时钟、复位、可修改、数据输出、完成);
参数大小=4;
//为了遵守S块规则,4x4数组将乘以
//size so row是宽的大小位数
参数位=8*大小;
输入时钟,复位,可修改;
输出数据输出,完成;
金属丝[1:0]可变性;
reg dataOut,完成;
注册号[7:0]地址;
整型文件;
reg[31:0]c;
reg eof;
始终@(posedge clk)
开始
如果(文件==0&&dEnable==2'b10)开始
file=$fopen(“test.kyle”);
结束
结束
始终@(posedge clk)开始
如果(addr>=32 | | done==1'b1)开始
c我建议一次将整个文件读入一个数组,然后迭代该数组以输出值
下面是一个如何将文件中的字节读入SystemVerilog队列的片段。如果您需要坚持使用普通的旧Verilog,您可以使用常规数组执行同样的操作
reg [8:0] c;
byte q[$];
int i;
// Read file a char at a time
file = $fopen("filename", "r");
c = $fgetc(file);
while (c != 'h1ff) begin
q.push_back(c);
$display("Got char [%0d] 0x%0h", i++, c);
c = $fgetc(file);
end
请注意,c
被定义为9位reg
。原因是,$fgetc
到达文件末尾时将返回-1。为了区分EOF和有效的0xFF,您需要这个额外的位
我不熟悉$feof
,也没有在Verilog 2001规范中看到它,因此这可能是Modelsim特有的。或者它可能是“函数不受支持”的来源。我建议将整个文件一次读入一个数组,然后遍历该数组以输出值
下面是一个如何将文件中的字节读入SystemVerilog队列的片段。如果您需要坚持使用普通的旧Verilog,您可以使用常规数组执行同样的操作
reg [8:0] c;
byte q[$];
int i;
// Read file a char at a time
file = $fopen("filename", "r");
c = $fgetc(file);
while (c != 'h1ff) begin
q.push_back(c);
$display("Got char [%0d] 0x%0h", i++, c);
c = $fgetc(file);
end
请注意,c
被定义为9位reg
。原因是,$fgetc
到达文件末尾时将返回-1。为了区分EOF和有效的0xFF,您需要这个额外的位
我不熟悉$feof
,也没有在Verilog 2001规范中看到它,因此这可能是Modelsim特有的。或者它可能是“不支持的函数”的来源