| /***************************************************************************** |
| |
| Licensed to Accellera Systems Initiative Inc. (Accellera) under one or |
| more contributor license agreements. See the NOTICE file distributed |
| with this work for additional information regarding copyright ownership. |
| Accellera licenses this file to you under the Apache License, Version 2.0 |
| (the "License"); you may not use this file except in compliance with the |
| License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, software |
| distributed under the License is distributed on an "AS IS" BASIS, |
| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
| implied. See the License for the specific language governing |
| permissions and limitations under the License. |
| |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| |
| std_ulogic_vector_datatype.cpp -- |
| |
| Original Author: Martin Janssen, Synopsys, Inc., 2002-02-15 |
| |
| *****************************************************************************/ |
| |
| /***************************************************************************** |
| |
| MODIFICATION LOG - modifiers, enter your name, affiliation, date and |
| changes you are making here. |
| |
| Name, Affiliation, Date: |
| Description of Modification: |
| |
| *****************************************************************************/ |
| |
| /* Main file for "std_ulogic_vector" data type */ |
| |
| #include "systemc.h" |
| |
| typedef sc_logic std_ulogic; |
| |
| #define std_ulogic_vector sc_lv |
| #define bool_vector sc_bv |
| |
| int sc_main(int ac, char *av[]) |
| { |
| |
| // 0. SIZE OF TYPES |
| int integer; |
| short short_integer; |
| long long_integer; |
| unsigned long unsigned_long; |
| signed long signed_long; |
| |
| cout << "\nINTEGER SIZE \t\t= " << sizeof integer << " bytes" |
| << "\nSHORT INTEGER SIZE \t= " << sizeof short_integer << " bytes" |
| << "\nLONG INTEGER SIZE \t= " << sizeof long_integer << " bytes" |
| << "\nUNSIGNED LONG SIZE \t= " << sizeof unsigned_long << " bytes" |
| << "\nSIGNED LONG SIZE \t= " << sizeof signed_long << " bytes" |
| << "\n" << endl; |
| |
| // 1. DECLARATION SYNTAX |
| std_ulogic_vector<9> a; |
| std_ulogic_vector<9> b; |
| std_ulogic_vector<68> big; |
| std_ulogic_vector<1284> huge_; |
| |
| // 2. TYPE CONVERSION |
| |
| // std_ulogic_vector <- C++ string |
| a = "01XZUWLH-"; |
| b = "ZZ1XX0UU1WWW"; |
| big = "11110000111100001111000011110000111100001111000011110000111100001111"; |
| huge_ = "111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111000011110000111100001111"; |
| |
| cout << "std_ulogic_vector \t<=\t C++ string" |
| << "\n-------------------------------------------" |
| << "\nA = " << a << "\t\t \"01XZUWLH-\" " |
| << "\nB = " << b << "\t\t \"ZZ1XX0UU1WWW\" " |
| << "\nBIG = " << big << "\n " |
| <<"\"11110000111100001111000011110000111100001111000011110000111100001111\"" |
| << "\nHUGE = " << huge_.range(0,63) << "\n " |
| << huge_.range(64,127) << "\n " |
| << huge_.range(128,191) << "\n " |
| << huge_.range(192,255) << "\n " |
| << huge_.range(256,319) << "\n " |
| << huge_.range(320,383) << "\n " |
| << huge_.range(384,447) << "\n " |
| << huge_.range(448,511) << "\n " |
| << huge_.range(512,575) << "\n " |
| << huge_.range(576,639) << "\n " |
| << huge_.range(640,703) << "\n " |
| << huge_.range(704,767) << "\n " |
| << huge_.range(768,831) << "\n " |
| << huge_.range(832,895) << "\n " |
| << huge_.range(896,959) << "\n " |
| << huge_.range(960,1023) << "\n " |
| << huge_.range(1024,1087) << "\n " |
| << huge_.range(1088,1151) << "\n " |
| << huge_.range(1152,1215) << "\n " |
| << huge_.range(1216,1279) << "\n " |
| << huge_.range(1280,1283) |
| << "\n" << endl; |
| |
| // std_ulogic_vector <- std_ulogic_vector |
| std_ulogic_vector<9> c; |
| std_ulogic_vector<68> big2; |
| |
| c = b; |
| big2 = big; |
| |
| cout << "std_ulogic_vector \t<=\t std_ulogic_vector" |
| << "\n--------------------------------------------------" |
| << "\nC = " << c << "\t\t ZZ1XX0XX1XXX" |
| << "\nBIG2 = " << big2 << "\n " |
| <<"\"11110000111100001111000011110000111100001111000011110000111100001111\"" |
| << "\n" << endl; |
| |
| // std_ulogic_vector <- C++ array of std_ulogic |
| std_ulogic_vector<9> d; |
| std_ulogic_vector<9> e; |
| std_ulogic_vector<68> big3; |
| std_ulogic cb1[9] = { sc_logic( 'U' ), sc_logic( 0 ) , sc_logic( 1 ), |
| sc_logic( 'X' ), sc_logic( 'Z' ), sc_logic( 'W' ), |
| sc_logic( 'H' ), sc_logic( 'L' ), sc_logic( '-' ) }; |
| std_ulogic cb2[12] = { sc_logic( 'U' ), sc_logic( 'U' ), sc_logic( 'X' ), |
| sc_logic( 'X' ), sc_logic( 1 ) , sc_logic( 1 ), |
| sc_logic( 0 ) , sc_logic( 0 ) , sc_logic( 1 ), |
| sc_logic( 1 ) , sc_logic( 'X' ), sc_logic( 'X' ) }; |
| std_ulogic cb3[80] = { sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 1 ), sc_logic( 1 ), sc_logic( 1 ), |
| sc_logic( 1 ), sc_logic( 0 ), sc_logic( 0 ), |
| sc_logic( 0 ), sc_logic( 0 ) }; |
| |
| d = cb1; |
| e = cb2; |
| big3 = cb3; |
| |
| cout << "std_ulogic_vector \t<=\t C++ array of bool" |
| << "\n--------------------------------------------------" |
| << "\nD = " << d << "\t\t -, L, H, W, Z, X, 1, 0, U" |
| << "\nE = " << e << "\t\t X, X, 1, 1, 0, 0, 1, 1, X, X, U, U" |
| << "\nBIG3 = " << big3 << "\n " |
| <<"\"11110000111100001111000011110000111100001111000011110000111100001111" |
| <<"\n 000011110000\"" |
| << "\n" << endl; |
| |
| // std_ulogic_vector <- bool_vector |
| std_ulogic_vector<4> f; |
| bool_vector<4> sv1; |
| |
| sv1 = "1010"; |
| |
| f = sv1; |
| |
| cout << "std_ulogic_vector \t<=\t bool_vector" |
| << "\n--------------------------------------------" |
| << "\nF = " << f << "\t\t \"1010\" " |
| << "\n" << endl; |
| |
| // std_ulogic_vector <- unsigned long |
| std_ulogic_vector<4> h; |
| std_ulogic_vector<32> i; |
| std_ulogic_vector<40> j; |
| unsigned long ul1 = 137; // ...10001001 |
| unsigned long ul2 = 137; // ...10001001 |
| unsigned long ul3 = 137; // ...10001001 |
| |
| h = ul1; |
| i = ul2; |
| j = ul3; |
| |
| cout << "std_ulogic_vector \t<=\t unsigned long" |
| << "\n----------------------------------------------" |
| << "\nH = " << h << "\t\t\t\t\t ...10001001 (137)" |
| << "\nI = " << i << "\t\t ...10001001 (137)" |
| << "\nJ = " << j << "\t ...10001001 (137)" |
| << "\n" << endl; |
| |
| // std_ulogic_vector <- sc_unsigned |
| std_ulogic_vector<4> k; |
| std_ulogic_vector<4> l; |
| std_ulogic_vector<4> m; |
| sc_biguint<2> scu1; |
| sc_biguint<4> scu2; |
| sc_biguint<8> scu3; |
| |
| scu1 = 3; // .........11 |
| scu2 = 13; // .......1101 |
| scu3 = 137; // ...10001001 |
| |
| k = scu1; |
| l = scu2; |
| m = scu3; |
| |
| cout << "std_ulogic_vector \t<=\t sc_unsigned" |
| << "\n--------------------------------------------" |
| << "\nK = " << k << "\t\t 11 (3)" |
| << "\nL = " << l << "\t\t 1101 (13)" |
| << "\nM = " << m << "\t\t 10001001 (137)" |
| << "\n" << endl; |
| |
| // std_ulogic_vector <- signed long |
| std_ulogic_vector<5> n; |
| std_ulogic_vector<32> o; |
| std_ulogic_vector<40> p; |
| std_ulogic_vector<5> q; |
| std_ulogic_vector<32> r; |
| std_ulogic_vector<40> s; |
| signed long sl1 = 137; // ...010001001 |
| signed long sl2 = 137; // ...010001001 |
| signed long sl3 = 137; // ...010001001 |
| signed long sl4 = -137; // ...101110111 |
| signed long sl5 = -137; // ...101110111 |
| signed long sl6 = -137; // ...101110111 |
| |
| n = sl1; |
| o = sl2; |
| p = sl3; |
| q = sl4; |
| r = sl5; |
| s = sl6; |
| |
| cout << "std_ulogic_vector \t<=\t signed long" |
| << "\n--------------------------------------------" |
| << "\nN = " << n << "\t\t\t\t\t ...010001001 (137)" |
| << "\nO = " << o << "\t\t ...010001001 (137)" |
| << "\nP = " << p << "\t ...010001001 (137)" |
| << "\nQ = " << q << "\t\t\t\t\t ...101110111 (-137)" |
| << "\nR = " << r << "\t\t ...101110111 (-137)" |
| << "\nS = " << s << "\t ...101110111 (-137)" |
| << "\n" << endl; |
| |
| // std_ulogic_vector <- sc_signed |
| std_ulogic_vector<5> t; |
| std_ulogic_vector<5> u; |
| std_ulogic_vector<5> v; |
| std_ulogic_vector<5> w; |
| std_ulogic_vector<5> x; |
| std_ulogic_vector<5> y; |
| sc_bigint<3> scs1; |
| sc_bigint<5> scs2; |
| sc_bigint<9> scs3; |
| sc_bigint<3> scs4; |
| sc_bigint<5> scs5; |
| sc_bigint<9> scs6; |
| |
| scs1 = 3; // ........011 |
| scs2 = 13; // ......01101 |
| scs3 = 137; // ..010001001 |
| scs4 = -3; // ........101 |
| scs5 = -13; // ......10011 |
| scs6 = -137; // ..101110111 |
| |
| t = scs1; |
| u = scs2; |
| v = scs3; |
| w = scs4; |
| x = scs5; |
| y = scs6; |
| |
| cout << "std_ulogic_vector \t<=\t sc_signed" |
| << "\n------------------------------------------" |
| << "\nT = " << t << "\t\t 011 (3)" |
| << "\nU = " << u << "\t\t 01101 (13)" |
| << "\nV = " << v << "\t\t 010001001 (137)" |
| << "\nW = " << w << "\t\t 101 (-3)" |
| << "\nX = " << x << "\t\t 10011 (-13)" |
| << "\nY = " << y << "\t\t 101110111 (-137)" |
| << "\n" << endl; |
| |
| // std_ulogic_vector .to_uint() |
| std_ulogic_vector<4> tu1; |
| std_ulogic_vector<32> tu2; |
| std_ulogic_vector<40> tu3; |
| std_ulogic_vector<4> tu4; |
| sc_biguint<2> tu5; |
| sc_biguint<4> tu6; |
| sc_biguint<8> tu7; |
| |
| tu1 = "1001"; // 9 |
| tu2 = "10000000000000000000000000000001"; // 2147483649 |
| tu3 = "0000000110000000000000000000000000000001"; // 6442450945 |
| tu4 = "1101"; |
| tu5 = tu4.to_uint(); |
| tu6 = tu4.to_uint(); |
| tu7 = tu4.to_uint(); |
| |
| cout << "std_ulogic_vector \t\t<=\t\t to_uint()" |
| << "\n-----------------------------------------------------------------" |
| << "\nTU1 = \t\t\t\t " << tu1 << "\t " << tu1.to_uint() |
| << "\nTU2 = " << tu2 << "\t " << tu2.to_uint() |
| << "\nTU3 = " << tu3 << "\t " << tu3.to_uint() |
| << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu5 << "\t (" |
| << tu5[1] << tu5[0] << ")" |
| << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu6 << "\t (" |
| << tu6[3] << tu6[2] << tu6[1] << tu6[0] << ")" |
| << "\nTU4 = " << tu4 << " \t\t\t\t\t " << tu7 << "\t(" |
| << tu7[7] << tu7[6] << tu7[5] << tu7[4] |
| << tu7[3] << tu7[2] << tu7[1] << tu7[0] << ")" |
| << "\n" << endl; |
| |
| // std_ulogic_vector .to_int() |
| std_ulogic_vector<4> ts1; |
| std_ulogic_vector<32> ts2; |
| std_ulogic_vector<40> ts3; |
| std_ulogic_vector<5> ts4; |
| sc_bigint<3> ts5; |
| sc_bigint<5> ts6; |
| sc_bigint<9> ts7; |
| |
| ts1 = "1001"; // -7 |
| ts2 = "11111111111111111111101111111001"; // -1031 |
| ts3 = "0000000111111111111111111111101111111001"; // 8589933561 |
| ts4 = "11001"; |
| ts5 = ts4.to_int(); |
| ts6 = ts4.to_int(); |
| ts7 = ts4.to_int(); |
| |
| cout << "std_ulogic_vector \t\t<=\t\t to_int()" |
| << "\n-----------------------------------------------------------------" |
| << "\nTS1 = \t\t\t\t " << ts1 << "\t " << ts1.to_int() |
| << "\nTS2 = " << ts2 << "\t " << ts2.to_int() |
| << "\nTS3 = " << ts3 << "\t " << ts3.to_int() |
| << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts5 << "\t (" |
| << ts5[2] << ts5[1] << ts5[0] << ")" |
| << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts6 << "\t (" |
| << ts6[4] << ts6[3] << ts6[2] << ts6[1] << ts6[0] << ")" |
| << "\nTS4 = " << ts4 << " \t\t\t\t\t " << ts7 << "\t(" |
| << ts7[8] << ts7[7] << ts7[6] << ts7[5] |
| << ts7[4] << ts7[3] << ts7[2] << ts7[1] << ts7[0] << ")" |
| << "\n" << endl; |
| |
| // std_ulogic_vector Typecasted to sc_unsigned |
| std_ulogic_vector<4> tcu1; |
| sc_biguint<2> tcu2; |
| sc_biguint<4> tcu3; |
| sc_biguint<8> tcu4; |
| |
| tcu1 = "1101"; |
| tcu2 = tcu1; |
| tcu3 = tcu1; |
| tcu4 = tcu1; |
| |
| cout << "std_ulogic_vector \t\t<=\t\t Typecast sc_unsigned" |
| << "\n-----------------------------------------------------------------" |
| << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu2 << "\t (" |
| << tcu2[1] << tcu2[0] << ")" |
| << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu3 << "\t (" |
| << tcu3[3] << tcu3[2] << tcu3[1] << tcu3[0] << ")" |
| << "\nTCU1 = " << tcu1 << " \t\t\t\t\t " << tcu4 << "\t(" |
| << tcu4[7] << tcu4[6] << tcu4[5] << tcu4[4] |
| << tcu4[3] << tcu4[2] << tcu4[1] << tcu4[0] << ")" |
| << "\n" << endl; |
| |
| // std_ulogic_vector Typecasted to sc_signed |
| std_ulogic_vector<5> tcs1; |
| sc_bigint<3> tcs2; |
| sc_bigint<5> tcs3; |
| sc_bigint<9> tcs4; |
| |
| tcs1 = "11001"; |
| tcs2 = sc_bigint<3>(tcs1); |
| tcs3 = sc_bigint<5>(tcs1); |
| tcs4 = sc_bigint<9>(tcs1); |
| |
| cout << "std_ulogic_vector \t\t<=\t\t Typecast sc_signed" |
| << "\n-----------------------------------------------------------------" |
| << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs2 << "\t (" |
| << tcs2[2] << tcs2[1] << tcs2[0] << ")" |
| << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs3 << "\t (" |
| << tcs3[4] << tcs3[3] << tcs3[2] << tcs3[1] << tcs3[0] << ")" |
| << "\nTCS1 = " << tcs1 << " \t\t\t\t\t " << tcs4 << "\t(" |
| << tcs4[8] << tcs4[7] << tcs4[6] << tcs4[5] |
| << tcs4[4] << tcs4[3] << tcs4[2] << tcs4[1] << tcs4[0] << ")" |
| << "\n" << endl; |
| |
| // std_ulogic_vector .to_string() |
| std_ulogic_vector<9> tstr; |
| std::string str; |
| |
| tstr = "UXZ01WLH-"; |
| str = tstr.to_string(); |
| |
| cout << "std_ulogic_vector \t<=\t to_string()" |
| << "\n--------------------------------------------" |
| << "\nTSTR = " << tstr << " \t\t " << str |
| << endl; |
| |
| |
| // 3. OPERATORS |
| // Supported operators: ~ & ^ | &= ^= |= = [] range() |
| // and_reduce() or_reduce() xor_reduce() |
| std_ulogic_vector<4> ra; |
| std_ulogic_vector<4> rb; |
| std_ulogic_vector<4> rc; |
| std_ulogic_vector<9> rd; |
| std_ulogic_vector<4> re; |
| std_ulogic_vector<4> rf; |
| std_ulogic_vector<4> rg; |
| std_ulogic_vector<9> rh; |
| std_ulogic_vector<4> ri; |
| std_ulogic_vector<4> rj; |
| std_ulogic_vector<4> rl; |
| |
| std_ulogic_vector<4> rdata4; |
| std_ulogic_vector<9> rdata9; |
| |
| rdata4 = "1000"; |
| rdata9 = "UXZ01WHL-"; |
| |
| ra.range(0,3) = rdata4; |
| rb.range(3,0) = rdata4; |
| ( rc.range(1,3), rc.range(0,0) ) = rdata4; |
| ( rd.range(8,6), rd.range(5,0) ) = rdata9; |
| re = "1111"; |
| re.range(2,2) = std_ulogic_vector<1>( rdata4[1] ); |
| |
| rf = rdata4.range(0,3); |
| rg = rdata4.range(3,0); |
| rh = ( rdata9.range(8,6), rdata9.range(5,0) ); |
| ri = ( rdata4.range(0,1), rdata4.range(2,3) ); |
| rj = "1111"; |
| rj[1] = rdata4.range(2,2)[0]; |
| rl = ( rdata4.range(1,1), rdata4.range(3,3), |
| rdata4.range(0,0), rdata4.range(2,2) ); |
| |
| cout.precision(15); |
| cout << "\nrange() tests" |
| << "\n-----------------------------------------------------------------" |
| << "\nINITIAL 4-BIT \t" << rdata4 |
| << "\nINITIAL 9-BIT \t" << rdata9 << "\n" |
| << "\nLVALUE RISE \t" |
| << ra[0] << "\t" << ra[1] << "\t" << ra[2] << "\t" << ra[3] |
| << "\nLVALUE FALL \t" |
| << rb[0] << "\t" << rb[1] << "\t" << rb[2] << "\t" << rb[3] |
| << "\nLVALUE SUB RISE " |
| << rc[0] << "\t" << rc[1] << "\t" << rc[2] << "\t" << rc[3] |
| << "\nLVALUE SUB FALL " |
| << rd[0] << "\t" << rd[1] << "\t" << rd[2] << "\t" |
| << rd[3] << "\t" << rd[4] << "\t" << rd[5] << "\t" |
| << rd[6] << "\t" << rd[7] << "\t" << rd[8] |
| << "\nLVALUE BIT \t" |
| << re[0] << "\t" << re[1] << "\t" << re[2] << "\t" << re[3] |
| << "\n\nRVALUE RISE \t" |
| << rf[0] << "\t" << rf[1] << "\t" << rf[2] << "\t" << rf[3] |
| << "\nRVALUE FALL \t" |
| << rg[0] << "\t" << rg[1] << "\t" << rg[2] << "\t" << rg[3] |
| << "\nRVALUE SUB FALL " |
| << rh[0] << "\t" << rh[1] << "\t" << rh[2] << "\t" |
| << rh[3] << "\t" << rh[4] << "\t" << rh[5] << "\t" |
| << rh[6] << "\t" << rh[7] << "\t" << rh[8] |
| << "\nRVALUE SUB RISE " |
| << ri[0] << "\t" << ri[1] << "\t" << ri[2] << "\t" << ri[3] |
| << "\nRVALUE BIT [] \t" |
| << rj[0] << "\t" << rj[1] << "\t" << rj[2] << "\t" << rj[3] |
| << "\nRVALUE BIT \t" |
| << rl[0] << "\t" << rl[1] << "\t" << rl[2] << "\t" << rl[3] |
| << endl; |
| |
| #define VAL1 "1010" |
| #define VAL2 "1000" |
| #define VAL3 "111011" |
| |
| std_ulogic_vector<4> op1; |
| op1 = VAL1; |
| std_ulogic_vector<4> op2; |
| op2 = VAL2; |
| std_ulogic_vector<4> r1, r2, r3, r4, r5, r6, r7, r8; |
| std_ulogic_vector<4> r9, r10, r11, r12, r13, r14; |
| std_ulogic_vector<4> r15, r16, r17, r18, r19; |
| std_ulogic_vector<4> r20, r21, r22, r23, r24; |
| std_ulogic_vector<4> r25, r26, r27, r28, r29; |
| std_ulogic_vector<4> r30, r31, r32, r33, r34, r35; |
| std_ulogic_vector<4> r36, r37, r38, r39, r40, r41; |
| std_ulogic r42, r43, r44; |
| |
| // r1 = op1 * op2; // Multiplication |
| |
| // r2 = op1 / op2; // Division |
| |
| // r3 = op1 % op2; // Modulus |
| |
| // r4 = op1 + op2; // Addition |
| |
| // r5 = op1 - op2; // Subtraction |
| |
| // r6 = !op1; // Logical NOT |
| |
| // r7 = op1 && op2; // Logical AND |
| |
| // r8 = op1 || op2; // Logical OR |
| |
| // r9 = op1 < op2; // Less than |
| |
| // r10 = op1 <= op2; // Less than or equal |
| |
| // r11 = op1 > op2; // Greater than |
| |
| // r12 = op1 >= op2; // Greater than or equal |
| |
| // r13 = op1 += op2; // Compound addition |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r14 = op1 -= op2; // Compound subtraction |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r15 = op1 *= op2; // Compound multiplication |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r16 = op1 /= op2; // Compound division |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r17 = op1 %= op2; // Compound modulus |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r18 = op1 <<= op2; // Compound shift left |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r19 = op1 >>= op2; // Compound shift right |
| // op1 = VAL1; op2 = VAL2; |
| |
| r20 = op1 &= op2; // Compound bitwise AND |
| op1 = VAL1; op2 = VAL2; |
| r36 = op1 &= VAL3; |
| op1 = VAL1; |
| |
| r21 = op1 ^= op2; // Compound bitwise XOR |
| op1 = VAL1; op2 = VAL2; |
| r37 = op1 ^= VAL3; |
| op1 = VAL1; |
| |
| r22 = op1 |= op2; // Compound bitwise OR |
| op1 = VAL1; op2 = VAL2; |
| r38 = op1 |= VAL3; |
| op1 = VAL1; |
| |
| // r23 = op2++; // Postfix increment |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r24 = ++op2; // Prefix increment |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r25 = op2--; // Postfix decrement |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r26 = --op2; // Prefix decrement |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r27 = (op1 > op2) ? true : false; // Arithmetic if |
| // r28 = (op1 < op2) ? true : false; // Arithmetic if |
| |
| // r29 = op1, r29 = op2; // Comma |
| |
| r30 = ~op1; // Bitwise NOT |
| |
| // r31 = op1 << op2; // Left shift |
| // op1 = VAL1; op2 = VAL2; |
| |
| // r32 = op1 >> op2; // Right shift |
| // op1 = VAL1; op2 = VAL2; |
| |
| r33 = op1 & op2; // Bitwise AND |
| r39 = op1 & VAL3; |
| |
| r34 = op1 ^ op2; // Bitwise XOR |
| r40 = op1 ^ VAL3; |
| |
| r35 = op1 | op2; // Bitwise OR |
| r41 = op1 | VAL3; |
| |
| r42 = and_reduce(op1); // AND reduction |
| |
| r43 = or_reduce(op1); // OR reduction |
| |
| r44 = xor_reduce(op1); // XOR reduction |
| |
| cout << "\nop1\t operator\t op2\t result [All operands are std_ulogic_vector]" |
| << "\n----------------------------------------------------------------" |
| // << "\n" << op1 << "\t * \t\t " << op2 << "\t = " << r1 |
| // << "\n" << op1 << "\t / \t\t " << op2 << "\t = " << r2 |
| // << "\n" << op1 << "\t % \t\t " << op2 << "\t = " << r3 |
| // << "\n" << op1 << "\t + \t\t " << op2 << "\t = " << r4 |
| // << "\n" << op1 << "\t - \t\t " << op2 << "\t = " << r5 |
| // << "\n!(" << op1 << ") \t\t\t\t = " << r6 |
| // << "\n" << op1 << "\t && \t\t " << op2 << "\t = " << r7 |
| // << "\n" << op1 << "\t || \t\t " << op2 << "\t = " << r8 |
| // << "\n" << op1 << "\t < \t\t " << op2 << "\t = " << r9 |
| // << "\n" << op1 << "\t <= \t\t " << op2 << "\t = " << r10 |
| // << "\n" << op1 << "\t > \t\t " << op2 << "\t = " << r11 |
| // << "\n" << op1 << "\t >= \t\t " << op2 << "\t = " << r12 |
| // << "\n" << op1 << "\t += \t\t " << op2 << "\t = " << r13 |
| // << "\n" << op1 << "\t -= \t\t " << op2 << "\t = " << r14 |
| // << "\n" << op1 << "\t *= \t\t " << op2 << "\t = " << r15 |
| // << "\n" << op1 << "\t /= \t\t " << op2 << "\t = " << r16 |
| // << "\n" << op1 << "\t %= \t\t " << op2 << "\t = " << r17 |
| // << "\n" << op1 << "\t <<=\t\t " << op2 << "\t = " << r18 |
| // << "\n" << op1 << "\t >>=\t\t " << op2 << "\t = " << r19 |
| << "\n" << op1 << "\t &= \t\t " << op2 << "\t = " << r20 |
| << "\n" << op1 << "\t ^= \t\t " << op2 << "\t = " << r21 |
| << "\n" << op1 << "\t |= \t\t " << op2 << "\t = " << r22 |
| // << "\n" << "\t ()++ \t " << op2 << "\t = " << r23 |
| // << "\n" << "\t ++() \t " << op2 << "\t = " << r24 |
| // << "\n" << "\t ()-- \t " << op2 << "\t = " << r25 |
| // << "\n" << "\t --() \t " << op2 << "\t = " << r26 |
| // << "\n" << op1 << "\t > ?: \t " << op2 << "\t = " << r27 |
| // << "\n" << op1 << "\t < ?: \t " << op2 << "\t = " << r28 |
| // << "\n" << op1 << "\t , \t\t " << op2 << "\t = " << r29 |
| << "\n~(" << op1 << ") \t\t\t = " << r30 |
| // << "\n" << op1 << "\t << \t\t " << op2 << "\t = " << r31 |
| // << "\n" << op1 << "\t >> \t\t " << op2 << "\t = " << r32 |
| << "\n" << op1 << "\t & \t\t " << op2 << "\t = " << r33 |
| << "\n" << op1 << "\t ^ \t\t " << op2 << "\t = " << r34 |
| << "\n" << op1 << "\t | \t\t " << op2 << "\t = " << r35 |
| << "\n\n" << op1 << "\t &= \t\t " << VAL3 << "\t = " << r36 |
| << "\n" << op1 << "\t ^= \t\t " << VAL3 << "\t = " << r37 |
| << "\n" << op1 << "\t |= \t\t " << VAL3 << "\t = " << r38 |
| << "\n" << op1 << "\t & \t\t " << VAL3 << "\t = " << r39 |
| << "\n" << op1 << "\t ^ \t\t " << VAL3 << "\t = " << r40 |
| << "\n" << op1 << "\t | \t\t " << VAL3 << "\t = " << r41 |
| << "\n\n" << op1 << "\t and_reduce() \t = " << r42 |
| << "\n" << op1 << "\t or_reduce() \t = " << r43 |
| << "\n" << op1 << "\t xor_reduce() \t = " << r44 |
| << endl; |
| |
| if (op1 == op2) // Equality |
| cout << "\n" << op1 << "\t == \t\t " << op2 << "\t -> true" << endl; |
| else |
| cout << "\n" << op1 << "\t == \t\t " << op2 << "\t -> false" << endl; |
| |
| if (op1 != op2) // Inequality |
| cout << op1 << "\t != \t\t " << op2 << "\t -> true" << endl; |
| else |
| cout << op1 << "\t != \t\t " << op2 << "\t -> false" << endl; |
| |
| op1 = op2 = "1111"; // Assignment operator concatenation |
| cout << "\n" << op1 << "\t = \t\t " << op2 << endl; |
| |
| |
| // 4. OPERATOR DEFINITIONS |
| // & | ^ ~ |
| std_ulogic_vector<9> suv; |
| std_ulogic_vector<9> vu; |
| std_ulogic_vector<9> vx; |
| std_ulogic_vector<9> v0; |
| std_ulogic_vector<9> v1; |
| std_ulogic_vector<9> vz; |
| std_ulogic_vector<9> vw; |
| std_ulogic_vector<9> vl; |
| std_ulogic_vector<9> vh; |
| std_ulogic_vector<9> vd; |
| std_ulogic_vector<9> bang; |
| |
| suv = "UX01ZWLH-"; |
| |
| vu = "UUUUUUUUU" & suv; |
| vx = "XXXXXXXXX" & suv; |
| v0 = "000000000" & suv; |
| v1 = "111111111" & suv; |
| vz = "ZZZZZZZZZ" & suv; |
| vw = "WWWWWWWWW" & suv; |
| vl = "LLLLLLLLL" & suv; |
| vh = "HHHHHHHHH" & suv; |
| vd = "---------" & suv; |
| |
| cout << "\n+-------------------------+" |
| << "\n| AND (&) | X | 0 | 1 | Z |" |
| << "\n+-------------------------+" |
| << "\n| X | " << vx[7] << " | " << vx[6] << " | " |
| << vx[5] << " | " << vx[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| 0 | " << v0[7] << " | " << v0[6] << " | " |
| << v0[5] << " | " << v0[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| 1 | " << v1[7] << " | " << v1[6] << " | " |
| << v1[5] << " | " << v1[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| Z | " << vz[7] << " | " << vz[6] << " | " |
| << vz[5] << " | " << vz[4] << " | " |
| << "\n+-------------------------+" |
| << endl; |
| |
| vu = "UUUUUUUUU" | suv; |
| vx = "XXXXXXXXX" | suv; |
| v0 = "000000000" | suv; |
| v1 = "111111111" | suv; |
| vz = "ZZZZZZZZZ" | suv; |
| vw = "WWWWWWWWW" | suv; |
| vl = "LLLLLLLLL" | suv; |
| vh = "HHHHHHHHH" | suv; |
| vd = "---------" | suv; |
| |
| cout << "\n+-------------------------+" |
| << "\n| OR (|) | X | 0 | 1 | Z |" |
| << "\n+-------------------------+" |
| << "\n| X | " << vx[7] << " | " << vx[6] << " | " |
| << vx[5] << " | " << vx[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| 0 | " << v0[7] << " | " << v0[6] << " | " |
| << v0[5] << " | " << v0[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| 1 | " << v1[7] << " | " << v1[6] << " | " |
| << v1[5] << " | " << v1[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| Z | " << vz[7] << " | " << vz[6] << " | " |
| << vz[5] << " | " << vz[4] << " | " |
| << "\n+-------------------------+" |
| << endl; |
| |
| vu = "UUUUUUUUU" ^ suv; |
| vx = "XXXXXXXXX" ^ suv; |
| v0 = "000000000" ^ suv; |
| v1 = "111111111" ^ suv; |
| vz = "ZZZZZZZZZ" ^ suv; |
| vw = "WWWWWWWWW" ^ suv; |
| vl = "LLLLLLLLL" ^ suv; |
| vh = "HHHHHHHHH" ^ suv; |
| vd = "---------" ^ suv; |
| |
| cout << "\n+-------------------------+" |
| << "\n| XOR (^) | X | 0 | 1 | Z |" |
| << "\n+-------------------------+" |
| << "\n| X | " << vx[7] << " | " << vx[6] << " | " |
| << vx[5] << " | " << vx[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| 0 | " << v0[7] << " | " << v0[6] << " | " |
| << v0[5] << " | " << v0[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| 1 | " << v1[7] << " | " << v1[6] << " | " |
| << v1[5] << " | " << v1[4] << " | " |
| << "\n+-------------------------+" |
| << "\n| Z | " << vz[7] << " | " << vz[6] << " | " |
| << vz[5] << " | " << vz[4] << " | " |
| << "\n+-------------------------+" |
| << endl; |
| |
| bang = ~suv; |
| |
| cout << "\n+-------------------------+" |
| << "\n| NOT (~) | X | 0 | 1 | Z |" |
| << "\n+-------------------------+" |
| << "\n| | " << bang[7] << " | " << bang[6] << " | " |
| << bang[5] << " | " << bang[4] << " | " |
| << "\n+-------------------------+" |
| << endl; |
| return 0; |
| } |