0

SystemC プロジェクトに取り組んでいるときに、シグナルとポートについて混乱した考えを持っている可能性があることに気付きました。私はこのようなものを持っているとしましょう:

//cell.hpp

SC_MODULE(Cell)
{ 
   sc_in<sc_uint<16> > datain; 
   sc_in<sc_uint<1> > addr_en;
   sc_in<sc_uint<1> >  enable;
   sc_out<sc_uint<16> > dataout;

   SC_CTOR(Cell)
   {
     SC_THREAD(memory_cell);
        sensitive << enable << datain << addr_en;
   }
   private:
   void memory_cell();
};



//cell.cpp

void Cell::memory_cell()
{  
   unsigned short data_cell=11;

   while(true)
   {     
      //wait for some input
      wait();     

      if (enable->read()==1 && addr_en->read()==1)
      {        
         data_cell=datain->read();        
      }

      else
      {
         if(enable->read()==0 && addr_en->read()==1)
         {
            dataout->write(data_cell);
         }
     }
   }
}





//test.cpp

SC_MODULE(TestBench)
{
   sc_signal<sc_uint<1> > address_en_s;
   sc_signal<sc_uint<16> > datain_s;  
   sc_signal<sc_uint<1> >  enable_s;
   sc_signal<sc_uint<16> > dataout_s;   

   Cell cella;

   SC_CTOR(TestBench) : cella("cella")
   {
        // Binding
        cella.addr_en(address_en_s);
        cella.datain(datain_s);
        cella.enable(enable_s);
        cella.dataout(dataout_s);               
        SC_THREAD(stimulus_thread);                        
   }


  private:
    void stimulus_thread() {  

//write a value:    
        datain_s.write(81);    
        address_en_s.write(1);    
        enable_s.write(1);         
        wait(SC_ZERO_TIME);


//read what we have written:
        enable_s.write(0);
        address_en_s.write(1);
        wait(SC_ZERO_TIME);

        cout << "Output value: " << dataout_s.read() << endl;


//let's cycle the memory again:       
        address_en_s.write(0);         
        wait(SC_ZERO_TIME);
        cout << "Output value: " << dataout_s.read() << endl;

    }   
};

このモジュールを実行してみましたが、奇妙なことに気付きました (少なくとも、私にとっては奇妙です): 刺激が値 (81) を書き込むとき、wait(SC_ZERO_TIME)メモリ スレッドがその を見つけたdatainenableaddress_enable値は既に更新されています。これは私が期待していたことです。メモリ スレッドで別のサイクルを実行し、値をメモリ セルポートにenable_esコピーするために、スティミュラスが値を変更するときにも同じことが起こります。私が理解していないのは、メモリモジュールがそのポートに書き込み、while ループの最初のステートメントに戻った後、スティミュラスモジュールがまだ古い値を持っている理由です。data_celldataoutdataoutwait()dataout_sチャネル (0) であり、メモリ モジュールによってコピーされたばかりの新しい値 (81) ではありません。次に、メモリ ループの別のサイクルを実行すると (たとえば、スティミュラス チャネルの値を変更するなど)、最終的にデータ出力チャネルが更新されます。

つまり、スティミュラス チャネルに書き込みを行ってからメモリ スレッドに切り替えると、メモリは更新された値を検出するように見えます。しかし、メモリ スレッドがそのポートに書き込みを行った後でスティミュラス スレッドに切り替えた場合、スレッドはそのチャネル (メモリ ポートにバインドされている) で古い値を引き続き認識します。

4

1 に答える 1

0

上記の例は、デルタ サイクルの同期が間違っているため、期待どおりに動作しません。

一般的に言えば、チャネルを介して接続された 2 つのモジュール A と B で実行されている 2 つのスレッドがあるとします。デルタ サイクル番号 1 の間にスレッド A に何かを書き込むと、デルタ サイクル 2 の間にスレッド B でのみ利用可能になります。また、スレッド B がデルタ サイクル 2 の間に何かを書き込む場合、スレッド A は、読み取るためにデルタ サイクル 3 まで待機する必要があります。それ。

これを認識すると、スティミュラス スレッドはwait(SC_ZERO_TIME)デルタ値を転送する必要があるため、メモリから正しい出力を読み取るために 2 つの連続したステートメントが必要になります。

于 2014-08-14T15:54:37.113 に答える