2012-05-16 1 views
0

Кажется, у меня есть некоторые проблемы в любое время, когда я пытаюсь что-либо использовать с I/O для verilog. Modelsim либо бросает функцию, которая не поддерживается для определенных функций, либо вообще ничего не делает. Мне просто нужно прочитать символ файла по символу и отправить каждый бит через порт. Может кто-нибудь помочьVerilog I/O, читающий символ

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; 

[email protected](posedge clk) 
begin 
if(file == 0 && dEnable == 2'b10)begin  
    file = $fopen("test.kyle");  
    end  
end 

[email protected](posedge clk) begin 
    if(addr>=32 || done==1'b1)begin 
    c <= $fgetc(file); 
    // c <= $getc(); 
    eof <= $feof(file); 
    addr <= 0; 
    end 
end 

[email protected](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 
[email protected](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

Я бы предложил прочитать весь файл за один раз в массив, а затем перебрать массив, чтобы вывести значения.

Ниже приведен фрагмент того, как читать байты из файла в очередь 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. Или это может быть источником «функции не поддерживаемой».

+0

Спасибо за это, мне дали хорошее понимание и я смог заставить программу работать. Я обнаружил, что дополнительный параметр в fopen, говорящий verilog, если я планирую читать запись, оба или добавить очень важно – kdgwill