00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <boost/test/unit_test.hpp>
00020 #include "torc/bitstream/Spartan6Bitstream.hpp"
00021 #include "torc/bitstream/Spartan6Packet.hpp"
00022 #include "torc/bitstream/Spartan6.hpp"
00023 #include "torc/common/DeviceDesignator.hpp"
00024 #include "torc/bitstream/OutputStreamHelpers.hpp"
00025 #include "torc/common/TestHelpers.hpp"
00026 #include "torc/common/DirectoryTree.hpp"
00027 #include <fstream>
00028 #include <iostream>
00029
00030 namespace torc {
00031 namespace bitstream {
00032
00033 BOOST_AUTO_TEST_SUITE(bitstream)
00034
00035
00036 BOOST_AUTO_TEST_CASE(Spartan6BitstreamCrcUnitTest) {
00037 std::fstream fileStream("Spartan6UnitTest.reference.bit", std::ios::binary | std::ios::in);
00038 Spartan6 bitstream;
00039 bitstream.read(fileStream, false);
00040 std::cout << bitstream << std::endl;
00041 bitstream.preflightPackets();
00042 BOOST_REQUIRE(true);
00043 }
00044
00045 BOOST_AUTO_TEST_CASE(Spartan6BistreamUnitTest) {
00046
00047
00048 boost::filesystem::path regressionPath
00049 = torc::common::DirectoryTree::getExecutablePath() / "regression";
00050 boost::filesystem::path generatedPath = regressionPath / "Spartan6UnitTest.generated.bit";
00051 boost::filesystem::path referencePath = regressionPath / "Spartan6UnitTest.reference.bit";
00052
00053
00054 std::fstream fileStream1(referencePath.string().c_str(), std::ios::binary | std::ios::in);
00055 BOOST_REQUIRE(fileStream1.good());
00056 Spartan6 bitstream1;
00057 bitstream1.read(fileStream1, false);
00058
00059 Spartan6Packet frameContents;
00060 Spartan6::const_iterator p = bitstream1.begin();
00061 Spartan6::const_iterator e = bitstream1.end();
00062 while(p < e) {
00063 if(p->isType2() && !p->isSyncWord1() && p->isWrite()) { frameContents = *p; break; }
00064 p++;
00065 }
00066
00067
00068 Spartan6Bitstream bitstream;
00069
00070 bitstream.setDesignName("Spartan6UnitTest.reference.ncd;UserID=0xFFFFFFFF");
00071 bitstream.setDeviceName("6slx25csg324");
00072 bitstream.setDesignDate("2011/02/09");
00073 bitstream.setDesignTime("13:28:37");
00074
00075
00076 Spartan6Packet dummy(Spartan6::eSynchronizationDummy);
00077 Spartan6Packet nop(Spartan6Packet::makeHeader(Spartan6::ePacketType1, Spartan6::eOpcodeNOP,
00078 0, 0));
00079
00080 bitstream.insert(bitstream.end(), 8, dummy);
00081
00082 bitstream.push_back(Spartan6Packet(Spartan6::eSynchronizationSync0));
00083 bitstream.push_back(Spartan6Packet(Spartan6::eSynchronizationSync1));
00084
00085 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCMD, Spartan6::eCommandRCRC));
00086
00087 bitstream.push_back(nop);
00088
00089 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterFLR, 0x0488));
00090
00091 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCOR1,
00092 Spartan6::makeSubfield(Spartan6::eRegisterCOR1, "Drive_Awake", "0") |
00093 Spartan6::makeSubfield(Spartan6::eRegisterCOR1, "CRC_Bypass", "0") |
00094 Spartan6::makeSubfield(Spartan6::eRegisterCOR1, "DonePipe", "No") |
00095 Spartan6::makeSubfield(Spartan6::eRegisterCOR1, "DriveDone", "No") |
00096 Spartan6::makeSubfield(Spartan6::eRegisterCOR1, "StartupClk", "Cclk") |
00097 0x3d00));
00098
00099 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCOR2,
00100 Spartan6::makeSubfield(Spartan6::eRegisterCOR2, "Reset_on_err", "Disable") |
00101 Spartan6::makeSubfield(Spartan6::eRegisterCOR2, "DONE_cycle", "5") |
00102 Spartan6::makeSubfield(Spartan6::eRegisterCOR2, "LCK_cycle", "NoWait") |
00103 Spartan6::makeSubfield(Spartan6::eRegisterCOR2, "GTS_cycle", "6") |
00104 Spartan6::makeSubfield(Spartan6::eRegisterCOR2, "GWE_cycle", "[UNDEFINED 6]") |
00105 0));
00106
00107 bitstream.push_back(Spartan6Packet::makeType1Write32(Spartan6::eRegisterIDCODE, 0x04004093));
00108
00109 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterMASK,
00110 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "DEC", "Writable") |
00111 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "Security", "Protected") |
00112 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "Persist", "Writable") |
00113 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "USE_EFUSE_KEY", "Writable") |
00114 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "CRC_EXTSTAT_DISABLE", "Writable") |
00115 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "RESERVED", "Writable") |
00116 0x80));
00117
00118 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCTL,
00119 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "DEC", "No") |
00120 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "Security", "None") |
00121 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "Persist", "No") |
00122 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "USE_EFUSE_KEY", "0") |
00123 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "CRC_EXTSTAT_DISABLE", "0") |
00124 0x0081));
00125 bitstream.insert(bitstream.end(), 17, nop);
00126
00127 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterSEU_OPT,
00128 Spartan6::makeSubfield(Spartan6::eRegisterSEU_OPT, "SEU_FREQ", "0x01be") |
00129 Spartan6::makeSubfield(Spartan6::eRegisterSEU_OPT, "SEU_RUN_ON_ERR", "Run") |
00130 Spartan6::makeSubfield(Spartan6::eRegisterSEU_OPT, "GLUT_MASK", "Unmask") |
00131 Spartan6::makeSubfield(Spartan6::eRegisterSEU_OPT, "SEU_ENABLE", "DISABLE") |
00132 0x3cc0));
00133
00134 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterPWRDN_REG,
00135 Spartan6::makeSubfield(Spartan6::eRegisterPWRDN_REG, "EN_EYES", "Disable") |
00136 Spartan6::makeSubfield(Spartan6::eRegisterPWRDN_REG, "FILTER", "0") |
00137 Spartan6::makeSubfield(Spartan6::eRegisterPWRDN_REG, "EN_PGSR", "No") |
00138 Spartan6::makeSubfield(Spartan6::eRegisterPWRDN_REG, "EN_PWRDN", "0") |
00139 Spartan6::makeSubfield(Spartan6::eRegisterPWRDN_REG, "KEEP_SCLK", "1") |
00140 0x0880));
00141
00142 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCBC_REG, 0));
00143
00144 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterHC_OPT_REG,
00145 Spartan6::makeSubfield(Spartan6::eRegisterHC_OPT_REG, "INIT", "0") |
00146 0x1f));
00147
00148 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCWDT, 0xffff));
00149
00150 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterPU_GTS, 0x0005));
00151
00152 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterMFWR, 0x0004));
00153
00154 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterPU_GWE, 0x0100));
00155
00156 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterGENERAL2, 0x0000));
00157
00158 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterGENERAL3, 0x0000));
00159
00160 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterGENERAL4, 0x0000));
00161
00162 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterGENERAL5, 0x0000));
00163
00164 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterMODE_REG,
00165 Spartan6::makeSubfield(Spartan6::eRegisterMODE_REG, "NEW_MODE", "No") |
00166 Spartan6::makeSubfield(Spartan6::eRegisterMODE_REG, "BUSWIDTH", "0") |
00167 Spartan6::makeSubfield(Spartan6::eRegisterMODE_REG, "BOOTMODE", "0") |
00168 Spartan6::makeSubfield(Spartan6::eRegisterMODE_REG, "BOOTVSEL", "[READ ONLY]") |
00169 0));
00170
00171 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterEXP_SIGN, 0x1be2));
00172
00173 bitstream.push_back(Spartan6Packet::makeType1Write32(Spartan6::eRegisterRDBK_SIGN, 0x00000000));
00174
00175 bitstream.push_back(nop);
00176 bitstream.push_back(nop);
00177
00178 bitstream.push_back(Spartan6Packet::makeType1Write32(Spartan6::eRegisterFARMAJ, 0x00000000));
00179
00180 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCMD, Spartan6::eCommandWCFG));
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191 bitstream.push_back(frameContents);
00192
00193 uint16_t crcEndWord = 0x0015;
00194 bitstream.push_back(Spartan6Packet(crcEndWord));
00195
00196 size_t length = 15;
00197 uint16_t* buffer = new uint16_t[length];
00198 uint16_t* ptr = buffer + length - 1;
00199 while(ptr >= buffer) *ptr-- = 0x2000;
00200 bitstream.push_back(Spartan6Packet::makeType1Write(length, Spartan6::eRegisterCWDT, buffer));
00201
00202 bitstream.insert(bitstream.end(), 9, nop);
00203
00204 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCMD,
00205 Spartan6::eCommandGRESTORE));
00206
00207 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCMD,
00208 Spartan6::eCommandLFRM));
00209
00210 bitstream.insert(bitstream.end(), 4, nop);
00211
00212 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCMD,
00213 Spartan6::eCommandGRESTORE));
00214
00215 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCMD,
00216 Spartan6::eCommandSTART));
00217
00218 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterMASK,
00219 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "DEC", "Writable") |
00220 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "Security", "Writable") |
00221 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "Persist", "Writable") |
00222 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "USE_EFUSE_KEY", "Writable") |
00223 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "CRC_EXTSTAT_DISABLE", "Writable") |
00224 Spartan6::makeSubfield(Spartan6::eRegisterMASK, "RESERVED", "Writable") |
00225 0x80));
00226
00227 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCTL,
00228 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "DEC", "No") |
00229 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "Security", "None") |
00230 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "Persist", "No") |
00231 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "USE_EFUSE_KEY", "0") |
00232 Spartan6::makeSubfield(Spartan6::eRegisterCTL, "CRC_EXTSTAT_DISABLE", "0") |
00233 0x81));
00234
00235 bitstream.push_back(Spartan6Packet::makeType1Write32(Spartan6::eRegisterCRC, 0x0002109d));
00236
00237 bitstream.push_back(Spartan6Packet::makeType1Write(Spartan6::eRegisterCMD,
00238 Spartan6::eCommandDESYNC));
00239 bitstream.insert(bitstream.end(), 14, nop);
00240
00241
00242 std::fstream outputStream(generatedPath.string().c_str(), std::ios::binary | std::ios::out);
00243 BOOST_REQUIRE(outputStream.good());
00244 bitstream.write(outputStream);
00245 outputStream.flush();
00246
00247
00248 std::fstream fileStream2(generatedPath.string().c_str(), std::ios::binary | std::ios::in);
00249 BOOST_REQUIRE(fileStream2.good());
00250 Spartan6 bitstream2;
00251 bitstream2.read(fileStream2, false);
00252
00253 std::cout << bitstream2 << std::endl;
00254 std::cerr << "TYPEOF BITSTREAM: " << typeid(bitstream2).name() << std::endl;
00255
00256
00257
00258
00259 }
00260
00261 BOOST_AUTO_TEST_SUITE_END()
00262
00263 }
00264 }
00265