1/***************************************************************************** 2 3 Licensed to Accellera Systems Initiative Inc. (Accellera) under one or 4 more contributor license agreements. See the NOTICE file distributed 5 with this work for additional information regarding copyright ownership. 6 Accellera licenses this file to you under the Apache License, Version 2.0 7 (the "License"); you may not use this file except in compliance with the 8 License. You may obtain a copy of the License at 9 10 http://www.apache.org/licenses/LICENSE-2.0 11 12 Unless required by applicable law or agreed to in writing, software 13 distributed under the License is distributed on an "AS IS" BASIS, 14 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 15 implied. See the License for the specific language governing 16 permissions and limitations under the License. 17 18 *****************************************************************************/ 19 20/***************************************************************************** 21 22 std_ulogic_vector_datatype.cpp -- 23 24 Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15 25 26 *****************************************************************************/ 27 28/***************************************************************************** 29 30 MODIFICATION LOG - modifiers, enter your name, affiliation, date and 31 changes you are making here. 32 33 Name, Affiliation, Date: 34 Description of Modification: 35 36 *****************************************************************************/ 37 38/* Main file for "std_ulogic_vector" data type */ 39 40#include "systemc.h" 41 42typedef sc_logic std_ulogic; 43 44#define std_ulogic_vector sc_lv 45#define bool_vector sc_bv 46 47int sc_main(int ac, char *av[]) 48{ 49 50// 0. SIZE OF TYPES 51 int integer; 52 short short_integer; 53 long long_integer; 54 unsigned long unsigned_long; 55 signed long signed_long; 56 57 cout << "\nINTEGER SIZE \t\t= " << sizeof integer << " bytes" 58 << "\nSHORT INTEGER SIZE \t= " << sizeof short_integer << " bytes" 59 << "\nLONG INTEGER SIZE \t= " << sizeof long_integer << " bytes" 60 << "\nUNSIGNED LONG SIZE \t= " << sizeof unsigned_long << " bytes" 61 << "\nSIGNED LONG SIZE \t= " << sizeof signed_long << " bytes" 62 << "\n" << endl; 63 64// 1. DECLARATION SYNTAX 65 std_ulogic_vector<9> a; 66 std_ulogic_vector<9> b; 67 std_ulogic_vector<68> big; 68 std_ulogic_vector<1284> huge_; 69 70// 2. TYPE CONVERSION 71 72 // std_ulogic_vector <- C++ string 73 a = "01XZUWLH-"; 74 b = "ZZ1XX0UU1WWW"; 75 big = "11110000111100001111000011110000111100001111000011110000111100001111"; 76 huge_ = "111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111"; 77 78 cout << "std_ulogic_vector \t<=\t C++ string" 79 << "\n-------------------------------------------" 80 << "\nA = " << a << "\t\t \"01XZUWLH-\" " 81 << "\nB = " << b << "\t\t \"ZZ1XX0UU1WWW\" " 82 << "\nBIG = " << big << "\n " 83 <<"\"11110000111100001111000011110000111100001111000011110000111100001111\"" 84 << "\nHUGE = " << huge_.range(0,63) << "\n " 85 << huge_.range(64,127) << "\n " 86 << huge_.range(128,191) << "\n " 87 << huge_.range(192,255) << "\n " 88 << huge_.range(256,319) << "\n " 89 << huge_.range(320,383) << "\n " 90 << huge_.range(384,447) << "\n " 91 << huge_.range(448,511) << "\n " 92 << huge_.range(512,575) << "\n " 93 << huge_.range(576,639) << "\n " 94 << huge_.range(640,703) << "\n " 95 << huge_.range(704,767) << "\n " 96 << huge_.range(768,831) << "\n " 97 << huge_.range(832,895) << "\n " 98 << huge_.range(896,959) << "\n " 99 << huge_.range(960,1023) << "\n " 100 << huge_.range(1024,1087) << "\n " 101 << huge_.range(1088,1151) << "\n " 102 << huge_.range(1152,1215) << "\n " 103 << huge_.range(1216,1279) << "\n " 104 << huge_.range(1280,1283) 105 << "\n" << endl; 106 107 // std_ulogic_vector <- std_ulogic_vector 108 std_ulogic_vector<9> c; 109 std_ulogic_vector<68> big2; 110 111 c = b; 112 big2 = big; 113 114 cout << "std_ulogic_vector \t<=\t std_ulogic_vector" 115 << "\n--------------------------------------------------" 116 << "\nC = " << c << "\t\t ZZ1XX0XX1XXX" 117 << "\nBIG2 = " << big2 << "\n " 118 <<"\"11110000111100001111000011110000111100001111000011110000111100001111\"" 119 << "\n" << endl; 120 121 // std_ulogic_vector <- C++ array of std_ulogic 122 std_ulogic_vector<9> d; 123 std_ulogic_vector<9> e; 124 std_ulogic_vector<68> big3; 125 std_ulogic cb1[9] = { sc_logic( 'U' ), sc_logic( 0 ) , sc_logic( 1 ), 126 sc_logic( 'X' ), sc_logic( 'Z' ), sc_logic( 'W' ), 127 sc_logic( 'H' ), sc_logic( 'L' ), sc_logic( '-' ) }; 128 std_ulogic cb2[12] = { sc_logic( 'U' ), sc_logic( 'U' ), sc_logic( 'X' ), 129 sc_logic( 'X' ), sc_logic( 1 ) , sc_logic( 1 ), 130 sc_logic( 0 ) , sc_logic( 0 ) , sc_logic( 1 ), 131 sc_logic( 1 ) , sc_logic( 'X' ), sc_logic( 'X' ) }; 132 std_ulogic cb3[80] = { sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), 133 sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ), 134 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ), 135 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), 136 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), 137 sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ), 138 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ), 139 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), 140 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), 141 sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ), 142 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ), 143 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), 144 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), 145 sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ), 146 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ), 147 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), 148 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), 149 sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ), 150 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ), 151 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), 152 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), 153 sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ), 154 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ), 155 sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), 156 sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), 157 sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ), 158 sc_logic( 0 ), sc_logic( 0 ) }; 159 160 d = cb1; 161 e = cb2; 162 big3 = cb3; 163 164 cout << "std_ulogic_vector \t<=\t C++ array of bool" 165 << "\n--------------------------------------------------" 166 << "\nD = " << d << "\t\t -, L, H, W, Z, X, 1, 0, U" 167 << "\nE = " << e << "\t\t X, X, 1, 1, 0, 0, 1, 1, X, X, U, U" 168 << "\nBIG3 = " << big3 << "\n " 169 <<"\"11110000111100001111000011110000111100001111000011110000111100001111" 170 <<"\n 000011110000\"" 171 << "\n" << endl; 172 173 // std_ulogic_vector <- bool_vector 174 std_ulogic_vector<4> f; 175 bool_vector<4> sv1; 176 177 sv1 = "1010"; 178 179 f = sv1; 180 181 cout << "std_ulogic_vector \t<=\t bool_vector" 182 << "\n--------------------------------------------" 183 << "\nF = " << f << "\t\t \"1010\" " 184 << "\n" << endl; 185 186 // std_ulogic_vector <- unsigned long 187 std_ulogic_vector<4> h; 188 std_ulogic_vector<32> i; 189 std_ulogic_vector<40> j; 190 unsigned long ul1 = 137; // ...10001001 191 unsigned long ul2 = 137; // ...10001001 192 unsigned long ul3 = 137; // ...10001001 193 194 h = ul1; 195 i = ul2; 196 j = ul3; 197 198 cout << "std_ulogic_vector \t<=\t unsigned long" 199 << "\n----------------------------------------------" 200 << "\nH = " << h << "\t\t\t\t\t ...10001001 (137)" 201 << "\nI = " << i << "\t\t ...10001001 (137)" 202 << "\nJ = " << j << "\t ...10001001 (137)" 203 << "\n" << endl; 204 205 // std_ulogic_vector <- sc_unsigned 206 std_ulogic_vector<4> k; 207 std_ulogic_vector<4> l; 208 std_ulogic_vector<4> m; 209 sc_biguint<2> scu1; 210 sc_biguint<4> scu2; 211 sc_biguint<8> scu3; 212 213 scu1 = 3; // .........11 214 scu2 = 13; // .......1101 215 scu3 = 137; // ...10001001 216 217 k = scu1; 218 l = scu2; 219 m = scu3; 220 221 cout << "std_ulogic_vector \t<=\t sc_unsigned" 222 << "\n--------------------------------------------" 223 << "\nK = " << k << "\t\t 11 (3)" 224 << "\nL = " << l << "\t\t 1101 (13)" 225 << "\nM = " << m << "\t\t 10001001 (137)" 226 << "\n" << endl; 227 228 // std_ulogic_vector <- signed long 229 std_ulogic_vector<5> n; 230 std_ulogic_vector<32> o; 231 std_ulogic_vector<40> p; 232 std_ulogic_vector<5> q; 233 std_ulogic_vector<32> r; 234 std_ulogic_vector<40> s; 235 signed long sl1 = 137; // ...010001001 236 signed long sl2 = 137; // ...010001001 237 signed long sl3 = 137; // ...010001001 238 signed long sl4 = -137; // ...101110111 239 signed long sl5 = -137; // ...101110111 240 signed long sl6 = -137; // ...101110111 241 242 n = sl1; 243 o = sl2; 244 p = sl3; 245 q = sl4; 246 r = sl5; 247 s = sl6; 248 249 cout << "std_ulogic_vector \t<=\t signed long" 250 << "\n--------------------------------------------" 251 << "\nN = " << n << "\t\t\t\t\t ...010001001 (137)" 252 << "\nO = " << o << "\t\t ...010001001 (137)" 253 << "\nP = " << p << "\t ...010001001 (137)" 254 << "\nQ = " << q << "\t\t\t\t\t ...101110111 (-137)" 255 << "\nR = " << r << "\t\t ...101110111 (-137)" 256 << "\nS = " << s << "\t ...101110111 (-137)" 257 << "\n" << endl; 258 259 // std_ulogic_vector <- sc_signed 260 std_ulogic_vector<5> t; 261 std_ulogic_vector<5> u; 262 std_ulogic_vector<5> v; 263 std_ulogic_vector<5> w; 264 std_ulogic_vector<5> x; 265 std_ulogic_vector<5> y; 266 sc_bigint<3> scs1; 267 sc_bigint<5> scs2; 268 sc_bigint<9> scs3; 269 sc_bigint<3> scs4; 270 sc_bigint<5> scs5; 271 sc_bigint<9> scs6; 272 273 scs1 = 3; // ........011 274 scs2 = 13; // ......01101 275 scs3 = 137; // ..010001001 276 scs4 = -3; // ........101 277 scs5 = -13; // ......10011 278 scs6 = -137; // ..101110111 279 280 t = scs1; 281 u = scs2; 282 v = scs3; 283 w = scs4; 284 x = scs5; 285 y = scs6; 286 287 cout << "std_ulogic_vector \t<=\t sc_signed" 288 << "\n------------------------------------------" 289 << "\nT = " << t << "\t\t 011 (3)" 290 << "\nU = " << u << "\t\t 01101 (13)" 291 << "\nV = " << v << "\t\t 010001001 (137)" 292 << "\nW = " << w << "\t\t 101 (-3)" 293 << "\nX = " << x << "\t\t 10011 (-13)" 294 << "\nY = " << y << "\t\t 101110111 (-137)" 295 << "\n" << endl; 296 297 // std_ulogic_vector .to_uint() 298 std_ulogic_vector<4> tu1; 299 std_ulogic_vector<32> tu2; 300 std_ulogic_vector<40> tu3; 301 std_ulogic_vector<4> tu4; 302 sc_biguint<2> tu5; 303 sc_biguint<4> tu6; 304 sc_biguint<8> tu7; 305 306 tu1 = "1001"; // 9 307 tu2 = "10000000000000000000000000000001"; // 2147483649 308 tu3 = "0000000110000000000000000000000000000001"; // 6442450945 309 tu4 = "1101"; 310 tu5 = tu4.to_uint(); 311 tu6 = tu4.to_uint(); 312 tu7 = tu4.to_uint(); 313 314 cout << "std_ulogic_vector \t\t<=\t\t to_uint()" 315 << "\n-----------------------------------------------------------------" 316 << "\nTU1 = \t\t\t\t " << tu1 << "\t " << tu1.to_uint() 317 << "\nTU2 = " << tu2 << "\t " << tu2.to_uint() 318 << "\nTU3 = " << tu3 << "\t " << tu3.to_uint() 319 << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu5 << "\t (" 320 << tu5[1] << tu5[0] << ")" 321 << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu6 << "\t (" 322 << tu6[3] << tu6[2] << tu6[1] << tu6[0] << ")" 323 << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu7 << "\t(" 324 << tu7[7] << tu7[6] << tu7[5] << tu7[4] 325 << tu7[3] << tu7[2] << tu7[1] << tu7[0] << ")" 326 << "\n" << endl; 327 328 // std_ulogic_vector .to_int() 329 std_ulogic_vector<4> ts1; 330 std_ulogic_vector<32> ts2; 331 std_ulogic_vector<40> ts3; 332 std_ulogic_vector<5> ts4; 333 sc_bigint<3> ts5; 334 sc_bigint<5> ts6; 335 sc_bigint<9> ts7; 336 337 ts1 = "1001"; // -7 338 ts2 = "11111111111111111111101111111001"; // -1031 339 ts3 = "0000000111111111111111111111101111111001"; // 8589933561 340 ts4 = "11001"; 341 ts5 = ts4.to_int(); 342 ts6 = ts4.to_int(); 343 ts7 = ts4.to_int(); 344 345 cout << "std_ulogic_vector \t\t<=\t\t to_int()" 346 << "\n-----------------------------------------------------------------" 347 << "\nTS1 = \t\t\t\t " << ts1 << "\t " << ts1.to_int() 348 << "\nTS2 = " << ts2 << "\t " << ts2.to_int() 349 << "\nTS3 = " << ts3 << "\t " << ts3.to_int() 350 << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts5 << "\t (" 351 << ts5[2] << ts5[1] << ts5[0] << ")" 352 << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts6 << "\t (" 353 << ts6[4] << ts6[3] << ts6[2] << ts6[1] << ts6[0] << ")" 354 << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts7 << "\t(" 355 << ts7[8] << ts7[7] << ts7[6] << ts7[5] 356 << ts7[4] << ts7[3] << ts7[2] << ts7[1] << ts7[0] << ")" 357 << "\n" << endl; 358 359 // std_ulogic_vector Typecasted to sc_unsigned 360 std_ulogic_vector<4> tcu1; 361 sc_biguint<2> tcu2; 362 sc_biguint<4> tcu3; 363 sc_biguint<8> tcu4; 364 365 tcu1 = "1101"; 366 tcu2 = tcu1; 367 tcu3 = tcu1; 368 tcu4 = tcu1; 369 370 cout << "std_ulogic_vector \t\t<=\t\t Typecast sc_unsigned" 371 << "\n-----------------------------------------------------------------" 372 << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu2 << "\t (" 373 << tcu2[1] << tcu2[0] << ")" 374 << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu3 << "\t (" 375 << tcu3[3] << tcu3[2] << tcu3[1] << tcu3[0] << ")" 376 << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu4 << "\t(" 377 << tcu4[7] << tcu4[6] << tcu4[5] << tcu4[4] 378 << tcu4[3] << tcu4[2] << tcu4[1] << tcu4[0] << ")" 379 << "\n" << endl; 380 381 // std_ulogic_vector Typecasted to sc_signed 382 std_ulogic_vector<5> tcs1; 383 sc_bigint<3> tcs2; 384 sc_bigint<5> tcs3; 385 sc_bigint<9> tcs4; 386 387 tcs1 = "11001"; 388 tcs2 = sc_bigint<3>(tcs1); 389 tcs3 = sc_bigint<5>(tcs1); 390 tcs4 = sc_bigint<9>(tcs1); 391 392 cout << "std_ulogic_vector \t\t<=\t\t Typecast sc_signed" 393 << "\n-----------------------------------------------------------------" 394 << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs2 << "\t (" 395 << tcs2[2] << tcs2[1] << tcs2[0] << ")" 396 << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs3 << "\t (" 397 << tcs3[4] << tcs3[3] << tcs3[2] << tcs3[1] << tcs3[0] << ")" 398 << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs4 << "\t(" 399 << tcs4[8] << tcs4[7] << tcs4[6] << tcs4[5] 400 << tcs4[4] << tcs4[3] << tcs4[2] << tcs4[1] << tcs4[0] << ")" 401 << "\n" << endl; 402 403 // std_ulogic_vector .to_string() 404 std_ulogic_vector<9> tstr; 405 std::string str; 406 407 tstr = "UXZ01WLH-"; 408 str = tstr.to_string(); 409 410 cout << "std_ulogic_vector \t<=\t to_string()" 411 << "\n--------------------------------------------" 412 << "\nTSTR = " << tstr << " \t\t " << str 413 << endl; 414 415 416// 3. OPERATORS 417// Supported operators: ~ & ^ | &= ^= |= = [] range() 418// and_reduce() or_reduce() xor_reduce() 419 std_ulogic_vector<4> ra; 420 std_ulogic_vector<4> rb; 421 std_ulogic_vector<4> rc; 422 std_ulogic_vector<9> rd; 423 std_ulogic_vector<4> re; 424 std_ulogic_vector<4> rf; 425 std_ulogic_vector<4> rg; 426 std_ulogic_vector<9> rh; 427 std_ulogic_vector<4> ri; 428 std_ulogic_vector<4> rj; 429 std_ulogic_vector<4> rl; 430 431 std_ulogic_vector<4> rdata4; 432 std_ulogic_vector<9> rdata9; 433 434 rdata4 = "1000"; 435 rdata9 = "UXZ01WHL-"; 436 437 ra.range(0,3) = rdata4; 438 rb.range(3,0) = rdata4; 439 ( rc.range(1,3), rc.range(0,0) ) = rdata4; 440 ( rd.range(8,6), rd.range(5,0) ) = rdata9; 441 re = "1111"; 442 re.range(2,2) = std_ulogic_vector<1>( rdata4[1] ); 443 444 rf = rdata4.range(0,3); 445 rg = rdata4.range(3,0); 446 rh = ( rdata9.range(8,6), rdata9.range(5,0) ); 447 ri = ( rdata4.range(0,1), rdata4.range(2,3) ); 448 rj = "1111"; 449 rj[1] = rdata4.range(2,2)[0]; 450 rl = ( rdata4.range(1,1), rdata4.range(3,3), 451 rdata4.range(0,0), rdata4.range(2,2) ); 452 453 cout.precision(15); 454 cout << "\nrange() tests" 455 << "\n-----------------------------------------------------------------" 456 << "\nINITIAL 4-BIT \t" << rdata4 457 << "\nINITIAL 9-BIT \t" << rdata9 << "\n" 458 << "\nLVALUE RISE \t" 459 << ra[0] << "\t" << ra[1] << "\t" << ra[2] << "\t" << ra[3] 460 << "\nLVALUE FALL \t" 461 << rb[0] << "\t" << rb[1] << "\t" << rb[2] << "\t" << rb[3] 462 << "\nLVALUE SUB RISE " 463 << rc[0] << "\t" << rc[1] << "\t" << rc[2] << "\t" << rc[3] 464 << "\nLVALUE SUB FALL " 465 << rd[0] << "\t" << rd[1] << "\t" << rd[2] << "\t" 466 << rd[3] << "\t" << rd[4] << "\t" << rd[5] << "\t" 467 << rd[6] << "\t" << rd[7] << "\t" << rd[8] 468 << "\nLVALUE BIT \t" 469 << re[0] << "\t" << re[1] << "\t" << re[2] << "\t" << re[3] 470 << "\n\nRVALUE RISE \t" 471 << rf[0] << "\t" << rf[1] << "\t" << rf[2] << "\t" << rf[3] 472 << "\nRVALUE FALL \t" 473 << rg[0] << "\t" << rg[1] << "\t" << rg[2] << "\t" << rg[3] 474 << "\nRVALUE SUB FALL " 475 << rh[0] << "\t" << rh[1] << "\t" << rh[2] << "\t" 476 << rh[3] << "\t" << rh[4] << "\t" << rh[5] << "\t" 477 << rh[6] << "\t" << rh[7] << "\t" << rh[8] 478 << "\nRVALUE SUB RISE " 479 << ri[0] << "\t" << ri[1] << "\t" << ri[2] << "\t" << ri[3] 480 << "\nRVALUE BIT [] \t" 481 << rj[0] << "\t" << rj[1] << "\t" << rj[2] << "\t" << rj[3] 482 << "\nRVALUE BIT \t" 483 << rl[0] << "\t" << rl[1] << "\t" << rl[2] << "\t" << rl[3] 484 << endl; 485 486#define VAL1 "1010" 487#define VAL2 "1000" 488#define VAL3 "111011" 489 490 std_ulogic_vector<4> op1; 491 op1 = VAL1; 492 std_ulogic_vector<4> op2; 493 op2 = VAL2; 494 std_ulogic_vector<4> r1, r2, r3, r4, r5, r6, r7, r8; 495 std_ulogic_vector<4> r9, r10, r11, r12, r13, r14; 496 std_ulogic_vector<4> r15, r16, r17, r18, r19; 497 std_ulogic_vector<4> r20, r21, r22, r23, r24; 498 std_ulogic_vector<4> r25, r26, r27, r28, r29; 499 std_ulogic_vector<4> r30, r31, r32, r33, r34, r35; 500 std_ulogic_vector<4> r36, r37, r38, r39, r40, r41; 501 std_ulogic r42, r43, r44; 502 503// r1 = op1 * op2; // Multiplication 504 505// r2 = op1 / op2; // Division 506 507// r3 = op1 % op2; // Modulus 508 509// r4 = op1 + op2; // Addition 510 511// r5 = op1 - op2; // Subtraction 512 513// r6 = !op1; // Logical NOT 514 515// r7 = op1 && op2; // Logical AND 516 517// r8 = op1 || op2; // Logical OR 518 519// r9 = op1 < op2; // Less than 520 521// r10 = op1 <= op2; // Less than or equal 522 523// r11 = op1 > op2; // Greater than 524 525// r12 = op1 >= op2; // Greater than or equal 526 527// r13 = op1 += op2; // Compound addition 528// op1 = VAL1; op2 = VAL2; 529 530// r14 = op1 -= op2; // Compound subtraction 531// op1 = VAL1; op2 = VAL2; 532 533// r15 = op1 *= op2; // Compound multiplication 534// op1 = VAL1; op2 = VAL2; 535 536// r16 = op1 /= op2; // Compound division 537// op1 = VAL1; op2 = VAL2; 538 539// r17 = op1 %= op2; // Compound modulus 540// op1 = VAL1; op2 = VAL2; 541 542// r18 = op1 <<= op2; // Compound shift left 543// op1 = VAL1; op2 = VAL2; 544 545// r19 = op1 >>= op2; // Compound shift right 546// op1 = VAL1; op2 = VAL2; 547 548 r20 = op1 &= op2; // Compound bitwise AND 549 op1 = VAL1; op2 = VAL2; 550 r36 = op1 &= VAL3; 551 op1 = VAL1; 552 553 r21 = op1 ^= op2; // Compound bitwise XOR 554 op1 = VAL1; op2 = VAL2; 555 r37 = op1 ^= VAL3; 556 op1 = VAL1; 557 558 r22 = op1 |= op2; // Compound bitwise OR 559 op1 = VAL1; op2 = VAL2; 560 r38 = op1 |= VAL3; 561 op1 = VAL1; 562 563// r23 = op2++; // Postfix increment 564// op1 = VAL1; op2 = VAL2; 565 566// r24 = ++op2; // Prefix increment 567// op1 = VAL1; op2 = VAL2; 568 569// r25 = op2--; // Postfix decrement 570// op1 = VAL1; op2 = VAL2; 571 572// r26 = --op2; // Prefix decrement 573// op1 = VAL1; op2 = VAL2; 574 575// r27 = (op1 > op2) ? true : false; // Arithmetic if 576// r28 = (op1 < op2) ? true : false; // Arithmetic if 577 578// r29 = op1, r29 = op2; // Comma 579 580 r30 = ~op1; // Bitwise NOT 581 582// r31 = op1 << op2; // Left shift 583// op1 = VAL1; op2 = VAL2; 584 585// r32 = op1 >> op2; // Right shift 586// op1 = VAL1; op2 = VAL2; 587 588 r33 = op1 & op2; // Bitwise AND 589 r39 = op1 & VAL3; 590 591 r34 = op1 ^ op2; // Bitwise XOR 592 r40 = op1 ^ VAL3; 593 594 r35 = op1 | op2; // Bitwise OR 595 r41 = op1 | VAL3; 596 597 r42 = and_reduce(op1); // AND reduction 598 599 r43 = or_reduce(op1); // OR reduction 600 601 r44 = xor_reduce(op1); // XOR reduction 602 603cout << "\nop1\t operator\t op2\t result [All operands are std_ulogic_vector]" 604 << "\n----------------------------------------------------------------" 605// << "\n" << op1 << "\t * \t\t " << op2 << "\t = " << r1 606// << "\n" << op1 << "\t / \t\t " << op2 << "\t = " << r2 607// << "\n" << op1 << "\t % \t\t " << op2 << "\t = " << r3 608// << "\n" << op1 << "\t + \t\t " << op2 << "\t = " << r4 609// << "\n" << op1 << "\t - \t\t " << op2 << "\t = " << r5 610// << "\n!(" << op1 << ") \t\t\t\t = " << r6 611// << "\n" << op1 << "\t && \t\t " << op2 << "\t = " << r7 612// << "\n" << op1 << "\t || \t\t " << op2 << "\t = " << r8 613// << "\n" << op1 << "\t < \t\t " << op2 << "\t = " << r9 614// << "\n" << op1 << "\t <= \t\t " << op2 << "\t = " << r10 615// << "\n" << op1 << "\t > \t\t " << op2 << "\t = " << r11 616// << "\n" << op1 << "\t >= \t\t " << op2 << "\t = " << r12 617// << "\n" << op1 << "\t += \t\t " << op2 << "\t = " << r13 618// << "\n" << op1 << "\t -= \t\t " << op2 << "\t = " << r14 619// << "\n" << op1 << "\t *= \t\t " << op2 << "\t = " << r15 620// << "\n" << op1 << "\t /= \t\t " << op2 << "\t = " << r16 621// << "\n" << op1 << "\t %= \t\t " << op2 << "\t = " << r17 622// << "\n" << op1 << "\t <<=\t\t " << op2 << "\t = " << r18 623// << "\n" << op1 << "\t >>=\t\t " << op2 << "\t = " << r19 624 << "\n" << op1 << "\t &= \t\t " << op2 << "\t = " << r20 625 << "\n" << op1 << "\t ^= \t\t " << op2 << "\t = " << r21 626 << "\n" << op1 << "\t |= \t\t " << op2 << "\t = " << r22 627// << "\n" << "\t ()++ \t " << op2 << "\t = " << r23 628// << "\n" << "\t ++() \t " << op2 << "\t = " << r24 629// << "\n" << "\t ()-- \t " << op2 << "\t = " << r25 630// << "\n" << "\t --() \t " << op2 << "\t = " << r26 631// << "\n" << op1 << "\t > ?: \t " << op2 << "\t = " << r27 632// << "\n" << op1 << "\t < ?: \t " << op2 << "\t = " << r28 633// << "\n" << op1 << "\t , \t\t " << op2 << "\t = " << r29 634 << "\n~(" << op1 << ") \t\t\t = " << r30 635// << "\n" << op1 << "\t << \t\t " << op2 << "\t = " << r31 636// << "\n" << op1 << "\t >> \t\t " << op2 << "\t = " << r32 637 << "\n" << op1 << "\t & \t\t " << op2 << "\t = " << r33 638 << "\n" << op1 << "\t ^ \t\t " << op2 << "\t = " << r34 639 << "\n" << op1 << "\t | \t\t " << op2 << "\t = " << r35 640 << "\n\n" << op1 << "\t &= \t\t " << VAL3 << "\t = " << r36 641 << "\n" << op1 << "\t ^= \t\t " << VAL3 << "\t = " << r37 642 << "\n" << op1 << "\t |= \t\t " << VAL3 << "\t = " << r38 643 << "\n" << op1 << "\t & \t\t " << VAL3 << "\t = " << r39 644 << "\n" << op1 << "\t ^ \t\t " << VAL3 << "\t = " << r40 645 << "\n" << op1 << "\t | \t\t " << VAL3 << "\t = " << r41 646 << "\n\n" << op1 << "\t and_reduce() \t = " << r42 647 << "\n" << op1 << "\t or_reduce() \t = " << r43 648 << "\n" << op1 << "\t xor_reduce() \t = " << r44 649 << endl; 650 651 if (op1 == op2) // Equality 652 cout << "\n" << op1 << "\t == \t\t " << op2 << "\t -> true" << endl; 653 else 654 cout << "\n" << op1 << "\t == \t\t " << op2 << "\t -> false" << endl; 655 656 if (op1 != op2) // Inequality 657 cout << op1 << "\t != \t\t " << op2 << "\t -> true" << endl; 658 else 659 cout << op1 << "\t != \t\t " << op2 << "\t -> false" << endl; 660 661 op1 = op2 = "1111"; // Assignment operator concatenation 662 cout << "\n" << op1 << "\t = \t\t " << op2 << endl; 663 664 665// 4. OPERATOR DEFINITIONS 666// & | ^ ~ 667 std_ulogic_vector<9> suv; 668 std_ulogic_vector<9> vu; 669 std_ulogic_vector<9> vx; 670 std_ulogic_vector<9> v0; 671 std_ulogic_vector<9> v1; 672 std_ulogic_vector<9> vz; 673 std_ulogic_vector<9> vw; 674 std_ulogic_vector<9> vl; 675 std_ulogic_vector<9> vh; 676 std_ulogic_vector<9> vd; 677 std_ulogic_vector<9> bang; 678 679 suv = "UX01ZWLH-"; 680 681 vu = "UUUUUUUUU" & suv; 682 vx = "XXXXXXXXX" & suv; 683 v0 = "000000000" & suv; 684 v1 = "111111111" & suv; 685 vz = "ZZZZZZZZZ" & suv; 686 vw = "WWWWWWWWW" & suv; 687 vl = "LLLLLLLLL" & suv; 688 vh = "HHHHHHHHH" & suv; 689 vd = "---------" & suv; 690 691 cout << "\n+-------------------------+" 692 << "\n| AND (&) | X | 0 | 1 | Z |" 693 << "\n+-------------------------+" 694 << "\n| X | " << vx[7] << " | " << vx[6] << " | " 695 << vx[5] << " | " << vx[4] << " | " 696 << "\n+-------------------------+" 697 << "\n| 0 | " << v0[7] << " | " << v0[6] << " | " 698 << v0[5] << " | " << v0[4] << " | " 699 << "\n+-------------------------+" 700 << "\n| 1 | " << v1[7] << " | " << v1[6] << " | " 701 << v1[5] << " | " << v1[4] << " | " 702 << "\n+-------------------------+" 703 << "\n| Z | " << vz[7] << " | " << vz[6] << " | " 704 << vz[5] << " | " << vz[4] << " | " 705 << "\n+-------------------------+" 706 << endl; 707 708 vu = "UUUUUUUUU" | suv; 709 vx = "XXXXXXXXX" | suv; 710 v0 = "000000000" | suv; 711 v1 = "111111111" | suv; 712 vz = "ZZZZZZZZZ" | suv; 713 vw = "WWWWWWWWW" | suv; 714 vl = "LLLLLLLLL" | suv; 715 vh = "HHHHHHHHH" | suv; 716 vd = "---------" | suv; 717 718 cout << "\n+-------------------------+" 719 << "\n| OR (|) | X | 0 | 1 | Z |" 720 << "\n+-------------------------+" 721 << "\n| X | " << vx[7] << " | " << vx[6] << " | " 722 << vx[5] << " | " << vx[4] << " | " 723 << "\n+-------------------------+" 724 << "\n| 0 | " << v0[7] << " | " << v0[6] << " | " 725 << v0[5] << " | " << v0[4] << " | " 726 << "\n+-------------------------+" 727 << "\n| 1 | " << v1[7] << " | " << v1[6] << " | " 728 << v1[5] << " | " << v1[4] << " | " 729 << "\n+-------------------------+" 730 << "\n| Z | " << vz[7] << " | " << vz[6] << " | " 731 << vz[5] << " | " << vz[4] << " | " 732 << "\n+-------------------------+" 733 << endl; 734 735 vu = "UUUUUUUUU" ^ suv; 736 vx = "XXXXXXXXX" ^ suv; 737 v0 = "000000000" ^ suv; 738 v1 = "111111111" ^ suv; 739 vz = "ZZZZZZZZZ" ^ suv; 740 vw = "WWWWWWWWW" ^ suv; 741 vl = "LLLLLLLLL" ^ suv; 742 vh = "HHHHHHHHH" ^ suv; 743 vd = "---------" ^ suv; 744 745 cout << "\n+-------------------------+" 746 << "\n| XOR (^) | X | 0 | 1 | Z |" 747 << "\n+-------------------------+" 748 << "\n| X | " << vx[7] << " | " << vx[6] << " | " 749 << vx[5] << " | " << vx[4] << " | " 750 << "\n+-------------------------+" 751 << "\n| 0 | " << v0[7] << " | " << v0[6] << " | " 752 << v0[5] << " | " << v0[4] << " | " 753 << "\n+-------------------------+" 754 << "\n| 1 | " << v1[7] << " | " << v1[6] << " | " 755 << v1[5] << " | " << v1[4] << " | " 756 << "\n+-------------------------+" 757 << "\n| Z | " << vz[7] << " | " << vz[6] << " | " 758 << vz[5] << " | " << vz[4] << " | " 759 << "\n+-------------------------+" 760 << endl; 761 762 bang = ~suv; 763 764 cout << "\n+-------------------------+" 765 << "\n| NOT (~) | X | 0 | 1 | Z |" 766 << "\n+-------------------------+" 767 << "\n| | " << bang[7] << " | " << bang[6] << " | " 768 << bang[5] << " | " << bang[4] << " | " 769 << "\n+-------------------------+" 770 << endl; 771 return 0; 772} 773