WiMAXTest.bsv
上传用户:aoptech
上传日期:2014-09-22
资源大小:784k
文件大小:5k
源码类别:

3G开发

开发平台:

Others

  1. //----------------------------------------------------------------------//
  2. // The MIT License 
  3. // 
  4. // Copyright (c) 2007 Alfred Man Cheuk Ng, mcn02@mit.edu 
  5. // 
  6. // Permission is hereby granted, free of charge, to any person 
  7. // obtaining a copy of this software and associated documentation 
  8. // files (the "Software"), to deal in the Software without 
  9. // restriction, including without limitation the rights to use,
  10. // copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the
  12. // Software is furnished to do so, subject to the following conditions:
  13. // 
  14. // The above copyright notice and this permission notice shall be
  15. // included in all copies or substantial portions of the Software.
  16. // 
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  18. // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  19. // OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  20. // NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  21. // HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  22. // WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  23. // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  24. // OTHER DEALINGS IN THE SOFTWARE.
  25. //----------------------------------------------------------------------//
  26. import Controls::*;
  27. import DataTypes::*;
  28. import Interfaces::*;
  29. import Parameters::*;
  30. import Transceiver::*;
  31. import RandomGen::*;
  32. import LibraryFunctions::*;
  33. import FPComplex::*;
  34. import GetPut::*;
  35. import TXController::*;
  36. import RXController::*;
  37. function Rate nextRate(Rate rate);
  38.    return case (rate)
  39.         R0: R1;
  40.        R1: R2;
  41.         R2: R3;
  42.         R3: R4;
  43.         R4: R5;
  44.        R5: R6;
  45.        R6: R0;
  46.   endcase;
  47. endfunction
  48. function CPSizeCtrl nextCPSize(CPSizeCtrl cpSize);
  49.    return case (cpSize)
  50.      CP0: CP1;
  51.      CP1: CP2;
  52.      CP2: CP3;
  53.      CP3: CP0;
  54.   endcase;
  55. endfunction
  56. (* synthesize *)
  57. module mkWiMAXTransmitterTest(Empty);
  58.    
  59.    // state elements
  60.    let transmitter <- mkWiMAXTransmitter;
  61.    Reg#(Bit#(32)) packetNo <- mkReg(0);
  62.    Reg#(Bit#(8))  data <- mkReg(0);
  63.    Reg#(Rate)     rate <- mkReg(R0);
  64.    Reg#(CPSizeCtrl) cpSize <- mkReg(CP0);
  65. //   Reg#(Bit#(11)) counter <- mkReg(0);
  66.    Reg#(Bit#(32)) cycle <- mkReg(0);
  67.    RandomGen#(64) randGen <- mkMersenneTwister(64'hB573AE980FF1134C);
  68.    
  69.    rule putTXStart(True);
  70.       let randData <- randGen.genRand;
  71.       let newRate = nextRate(rate);
  72.       let newLength = randData[22:12];
  73.       let newBSID = randData[11:8];
  74.       let newUIUC = randData[7:4];
  75.       let newFID  = randData[3:0];
  76.       let txVec = TXVector{rate: newRate,
  77.    length: newLength,
  78.    bsid: newBSID,
  79.    uiuc: newUIUC,
  80.    fid:  newFID,
  81.    power: 0};
  82.       rate <= newRate;
  83.       packetNo <= packetNo + 1;
  84.       transmitter.txStart(txVec);
  85.       $display("Going to send a packet %d at rate:%d, length:%d,bsid:%d, uiuc:%d, fid:%d",packetNo,newRate,newLength,newBSID,newUIUC,newFID);
  86.       if (packetNo == 51)
  87. $finish;
  88.    endrule
  89.    
  90.    rule putData(True);
  91.       data <= data + 1;
  92.       transmitter.txData(data);
  93.       $display("input: rate:%d, data:%h",rate,data);
  94.    endrule
  95.    
  96.    rule getOutput(True);
  97.       let mesg <- transmitter.out.get;
  98.       $write("output: data:");
  99.       fpcmplxWrite(4,mesg);
  100.       $display("");
  101.    endrule
  102.    
  103.    rule tick(True);
  104.       cycle <= cycle + 1;
  105.       if (cycle == 500000)
  106.  $finish;
  107.       $display("Cycle: %d",cycle);
  108.    endrule
  109. endmodule
  110. (* synthesize *)
  111. module mkWiMAXTest (Empty);
  112.    
  113.    // state elements
  114.    let transceiver <- mkTransceiver;
  115.    let transmitter =  transceiver.transmitter;
  116.    let receiver    =  transceiver.receiver;
  117.    Reg#(Bit#(32)) packetNo <- mkReg(0);
  118.    Reg#(Bit#(8))  data <- mkReg(0);
  119.    Reg#(Rate)     rate <- mkReg(R0);
  120.    Reg#(Bit#(32)) cycle <- mkReg(0);
  121.    RandomGen#(64) randGen <- mkMersenneTwister(64'hB573AE980FF1134C);
  122.    
  123.    // rules
  124.    rule putTXStart(True);
  125.       let randData <- randGen.genRand;
  126.       let newRate = nextRate(rate);
  127.       Bit#(11) newLength = truncate(randData);
  128.       let txVec = TXVector{rate: newRate,
  129.    length: newLength,
  130.    cpSize: CP0,
  131.    bsid: randData[3:0],
  132.    uiuc: randData[7:4],
  133.    fid: randData[11:8],
  134.    power: 0};
  135.       rate <= newRate;
  136.       packetNo <= packetNo + 1;
  137.       transmitter.txStart(txVec);
  138.       receiver.inFeedback.put(txVec);
  139.       $display("Going to send a packet %d at rate:%d, length:%d",packetNo,newRate,newLength);
  140.       if (packetNo == 51)
  141. $finish;
  142.    endrule
  143.    
  144.    rule putData(True);
  145.       data <= data + 1;
  146.       transmitter.txData(data);
  147.       $display("transmitter input: rate:%d, data:%h",rate,data);
  148.    endrule
  149.    
  150.    rule getOutput(True);
  151.       let mesg <- transmitter.out.get;
  152.       receiver.in.put(mesg);
  153.       $write("transmitter output: data:");
  154.       fpcmplxWrite(4,mesg);
  155.       $display("");
  156.    endrule
  157.    
  158.    rule getLength(True);
  159.       let length <- receiver.outLength.get;
  160.       $display("Going to receiver a packet of length:%d",length);
  161.    endrule
  162.    
  163.    rule getData(True);
  164.       let outData <- receiver.outData.get;
  165.       $display("receiver output: data:%h",outData);
  166.    endrule
  167.    
  168.    rule tick(True);
  169.       cycle <= cycle + 1;
  170.       if (cycle == 100000)
  171.  $finish;
  172. //      $display("Cycle: %d",cycle);
  173.    endrule
  174. endmodule