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/VirtexBitstream.hpp"
00021 #include "torc/bitstream/Virtex5.hpp"
00022 #include "torc/common/DirectoryTree.hpp"
00023 #include "torc/common/DeviceDesignator.hpp"
00024 #include "torc/bitstream/OutputStreamHelpers.hpp"
00025 #include "torc/common/TestHelpers.hpp"
00026 #include <fstream>
00027 #include <iostream>
00028
00029
00030 #include "torc/bitstream/Virtex.hpp"
00031
00032 namespace torc {
00033 namespace bitstream {
00034
00035 BOOST_AUTO_TEST_SUITE(bitstream)
00036
00037
00038
00039 BOOST_AUTO_TEST_CASE(VirtexBitstreamCrcUnitTest) {
00040 std::fstream fileStream("VirtexUnitTest.reference.bit", std::ios::binary | std::ios::in);
00041 Virtex bitstream;
00042 bitstream.read(fileStream, false);
00043 std::cout << bitstream << std::endl;
00044 bitstream.preflightPackets();
00045 BOOST_REQUIRE(true);
00046 }
00047
00048
00049
00050 BOOST_AUTO_TEST_CASE(VirtexBitstreamUnitTest) {
00051
00052
00053 boost::filesystem::path regressionPath
00054 = torc::common::DirectoryTree::getExecutablePath() / "regression";
00055 boost::filesystem::path generatedPath = regressionPath / "VirtexBitstreamUnitTest.generated.bit";
00056 boost::filesystem::path referencePath = regressionPath / "Virtex5UnitTest.reference.bit";
00057
00058
00059 std::fstream fileStream1(referencePath.string().c_str(), std::ios::binary | std::ios::in);
00060 BOOST_REQUIRE(fileStream1.good());
00061 Virtex5 bitstream1;
00062 bitstream1.read(fileStream1, false);
00063
00064 VirtexPacket frameContents;
00065 Virtex5::const_iterator p = bitstream1.begin();
00066 Virtex5::const_iterator e = bitstream1.end();
00067 while(p < e) {
00068 if(p->isType2() && p->isWrite()) { frameContents = *p; break; }
00069 p++;
00070 }
00071
00072
00073 VirtexBitstream bitstream;
00074
00075 bitstream.setDesignName("Virtex5UnitTest.reference.ncd;UserID=0xFFFFFFFF");
00076 bitstream.setDeviceName("5vlx20tff323");
00077 bitstream.setDesignDate("2010/10/08");
00078 bitstream.setDesignTime("15:06:11");
00079
00080
00081 VirtexPacket dummy(Virtex5::eSynchronizationDummy);
00082 VirtexPacket nop(VirtexPacket::makeHeader(Virtex5::ePacketType1, Virtex5::eOpcodeNOP,
00083 0, 0));
00084
00085 bitstream.insert(bitstream.end(), 8, dummy);
00086
00087 bitstream.push_back(VirtexPacket(Virtex5::eSynchronizationBusWidthSync));
00088 bitstream.push_back(VirtexPacket(Virtex5::eSynchronizationBusWidthDetect));
00089 bitstream.push_back(dummy);
00090 bitstream.push_back(dummy);
00091
00092 bitstream.push_back(VirtexPacket(Virtex5::eSynchronizationSync));
00093 bitstream.push_back(nop);
00094
00095 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterWBSTAR, 0));
00096
00097 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD, Virtex5::eCommandNULL));
00098 bitstream.push_back(nop);
00099
00100 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD, Virtex5::eCommandRCRC));
00101 bitstream.push_back(nop);
00102 bitstream.push_back(nop);
00103
00104 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterTIMER, 0));
00105
00106 bitstream.push_back(VirtexPacket::makeType1Write(19, 0));
00107
00108 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCOR0,
00109 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "CRC", "Enable") |
00110 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "DONE_status", "DonePin") |
00111 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "DonePipe", "No") |
00112 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "DriveDone", "No") |
00113 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "Capture", "Continuous") |
00114 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "ConfigRate", "[UNKNOWN 0]") |
00115 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "StartupClk", "Cclk") |
00116 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "DONE_cycle", "4") |
00117 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "Match_cycle", "NoWait") |
00118 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "LCK_cycle", "NoWait") |
00119 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "GTS_cycle", "5") |
00120 Virtex5::makeSubfield(Virtex5::eRegisterCOR0, "GWE_cycle", "6") |
00121 0));
00122
00123 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCOR1,
00124 Virtex5::makeSubfield(Virtex5::eRegisterCOR1, "PersistDeassertAtDesynch", "Disabled") |
00125 Virtex5::makeSubfield(Virtex5::eRegisterCOR1, "InitAsCRCErrorPin", "Disabled") |
00126 Virtex5::makeSubfield(Virtex5::eRegisterCOR1, "ContinuousReadbackCRC", "Disabled") |
00127 Virtex5::makeSubfield(Virtex5::eRegisterCOR1, "BPI_1st_read_cycle", "1") |
00128 Virtex5::makeSubfield(Virtex5::eRegisterCOR1, "BPI_page_size", "1") |
00129 0));
00130
00131 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterIDCODE, 0x02a56093));
00132
00133 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD,
00134 Virtex5::eCommandSWITCH));
00135 bitstream.push_back(nop);
00136
00137 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterMASK,
00138 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "ICAP_sel", "Protected") |
00139 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "OverTempPowerDown", "Protected") |
00140 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "GLUTMASK", "Protected") |
00141 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "Encrypt", "Protected") |
00142 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "Security", "Protected") |
00143 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "Persist", "Protected") |
00144 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "GTS_USER_B", "Protected") |
00145 0x00400000 |
00146 0));
00147
00148 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCTL0,
00149 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "ICAP_sel", "Top") |
00150 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "OverTempPowerDown", "Disable") |
00151 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "GLUTMASK", "Masked") |
00152 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "Encrypt", "No") |
00153 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "Security", "None") |
00154 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "Persist", "No") |
00155 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "GTS_USER_B", "IoDisabled") |
00156 0x00400000 |
00157 0));
00158
00159 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterMASK, 0));
00160
00161 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCTL1, 0));
00162
00163 bitstream.insert(bitstream.end(), 8, nop);
00164
00165 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterFAR, 0));
00166
00167 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD, Virtex5::eCommandWCFG));
00168 bitstream.push_back(nop);
00169
00170 bitstream.push_back(VirtexPacket::makeNullType1Write(Virtex5::eRegisterFDRI));
00171
00172
00173
00174
00175
00176
00177
00178 bitstream.push_back(frameContents);
00179
00180 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCRC, 0x2d63e9d));
00181
00182 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD,
00183 Virtex5::eCommandGRESTORE));
00184 bitstream.push_back(nop);
00185
00186 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD,
00187 Virtex5::eCommandLFRM));
00188 bitstream.insert(bitstream.end(), 100, nop);
00189
00190 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD,
00191 Virtex5::eCommandGRESTORE));
00192 bitstream.insert(bitstream.end(), 30, nop);
00193
00194 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD,
00195 Virtex5::eCommandSTART));
00196 bitstream.push_back(nop);
00197
00198 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterFAR, 0x00ef8000));
00199
00200 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterMASK,
00201 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "ICAP_sel", "Protected") |
00202 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "OverTempPowerDown", "Protected") |
00203 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "GLUTMASK", "Protected") |
00204 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "Encrypt", "Protected") |
00205 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "Security", "Protected") |
00206 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "Persist", "Protected") |
00207 Virtex5::makeSubfield(Virtex5::eRegisterMASK, "GTS_USER_B", "Protected") |
00208 0x00400000 |
00209 0));
00210
00211 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCTL0,
00212 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "ICAP_sel", "Top") |
00213 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "OverTempPowerDown", "Disable") |
00214 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "GLUTMASK", "Masked") |
00215 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "Encrypt", "No") |
00216 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "Security", "None") |
00217 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "Persist", "No") |
00218 Virtex5::makeSubfield(Virtex5::eRegisterCTL0, "GTS_USER_B", "IoDisabled") |
00219 0x00400000 |
00220 0));
00221
00222 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCRC, 0x0c90449e));
00223
00224 bitstream.push_back(VirtexPacket::makeType1Write(Virtex5::eRegisterCMD,
00225 Virtex5::eCommandDESYNCH));
00226 bitstream.insert(bitstream.end(), 61, nop);
00227
00228
00229 std::fstream outputStream(generatedPath.string().c_str(), std::ios::binary | std::ios::out);
00230 BOOST_REQUIRE(outputStream.good());
00231 bitstream.write(outputStream);
00232 outputStream.flush();
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243 BOOST_CHECK(torc::common::fileContentsAreEqual(generatedPath, referencePath));
00244
00245 }
00246
00247 BOOST_AUTO_TEST_SUITE_END()
00248
00249 }
00250 }
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305