1

Verilog の I/O で何かをしようとすると、問題が発生するようです。Modelsim は、特定の関数でサポートされていない関数をスローするか、まったく何もしません。ファイルを 1 文字ずつ読み取り、各ビットをポート経由で送信するだけです。誰でも手伝ってもらえますか

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

1 に答える 1

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を区別するには、この余分なビットが必要です。

私はVerilog2001の仕様に精通し$feofておらず、表示されていないため、Modelsimに固有のものである可能性があります。または、「サポートされていない機能」の原因である可能性があります。

于 2012-05-16T18:31:33.527 に答える