Skip to content

Commit 6f2034f

Browse files
authored
Merge pull request #690 from CAS-Atlantic/rtlint_compare_bug
ODIN II: updated RTL library
2 parents 088f8bf + cd90e80 commit 6f2034f

File tree

3 files changed

+74
-46
lines changed

3 files changed

+74
-46
lines changed

libs/librtlnumber/regression_tests/basic_regression_tests.csv

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -65,14 +65,46 @@ Logical-Not, !, 4'b1010, 1'b0
6565
Logical-And, 4'b1010, &&, 4'b1000, 1'b1
6666
Logical-Or, 4'b1010, ||, 4'b1000, 1'b1
6767
Logical-Or, 4'b0000, ||, 4'b1000, 1'b1
68-
Logical-Or, 4'b0000, ||, 4'b0000, 1'b0
69-
Logical-less, 4'b0000, <, 4'b0001, 1'b1
70-
Logical-greater, 4'b0000, >, 4'b0001, 1'b0
71-
Logical-greater-equal, 4'b0000, >=, 4'b0000, 1'b1
72-
Logical-less-equal, 4'b0000, <=, 4'b0000, 1'b1
68+
Logical-Or, 4'b0000, ||, 4'b0000, 1'b0
69+
Logical-less, 4'b0000, <, 4'b0000, 1'b0
70+
Logical-less-1, 4'b0000, <, 4'b0001, 1'b1
71+
Logical-less-2, 4'b0001, <, 4'b0000, 1'b0
72+
Logical-less-3, 4'bxxxx, <, 4'b0001, 1'bx
73+
Logical-less-4, 4'b0001, <, 4'bxxxx, 1'bx
74+
Logical-less-5, 4'b0xxx, <, 4'b1001, 1'b1
75+
Logical-less-6, 4'b1001, <, 4'b0xxx, 1'b0
76+
Logical-less-7, 4'sb1001, <, 4'sb0xxx, 1'b1
77+
Logical-less-8, 4'sb0xxx, <, 4'sb1001, 1'b0
78+
Logical-greater, 4'b0000, >, 4'b0000, 1'b0
79+
Logical-greater-1, 4'b0000, >, 4'b0001, 1'b0
80+
Logical-greater-2, 4'b0001, >, 4'b0000, 1'b1
81+
Logical-greater-3, 4'bxxxx, >, 4'b0001, 1'bx
82+
Logical-greater-4, 4'b0001, >, 4'bxxxx, 1'bx
83+
Logical-greater-5, 4'b0xxx, >, 4'b1001, 1'b0
84+
Logical-greater-6, 4'b1001, >, 4'b0xxx, 1'b1
85+
Logical-greater-7, 4'sb1001, >, 4'sb0xxx, 1'b0
86+
Logical-greater-8, 4'sb0xxx, >, 4'sb1001, 1'b1
87+
Logical-gr-equal, 4'b0000, >=, 4'b0000, 1'b1
88+
Logical-gr-equal-1, 4'b0000, >=, 4'b0001, 1'b0
89+
Logical-gr-equal-2, 4'b0001, >=, 4'b0000, 1'b1
90+
Logical-gr-equal-3, 4'bxxxx, >=, 4'b0001, 1'bx
91+
Logical-gr-equal-4, 4'b0001, >=, 4'bxxxx, 1'bx
92+
Logical-less-equal, 4'b0000, <=, 4'b0000, 1'b1
93+
Logical-less-equal-1, 4'b0000, <=, 4'b0001, 1'b1
94+
Logical-less-equal-2, 4'b0001, <=, 4'b0000, 1'b0
95+
Logical-less-equal-3, 4'bxxxx, <=, 4'b0001, 1'bx
96+
Logical-less-equal-4, 4'b0001, <=, 4'bxxxx, 1'bx
7397
Logical-equal, 4'b0000, ==, 4'b0000, 1'b1
98+
Logical-equal-1, 4'b0000, ==, 4'b0001, 1'b0
99+
Logical-equal-2, 4'b0001, ==, 4'b0000, 1'b0
100+
Logical-equal-3, 4'bxxxx, ==, 4'b0001, 1'bx
101+
Logical-equal-4, 4'b0001, ==, 4'bxxxx, 1'bx
74102
Logical-bits, 'b1110, ==, 4'b1110, 1'b1
75-
Logical-not-equal, 4'b0000, !=, 4'b0001, 1'b1
103+
Logical-not-equal, 4'b0000, !=, 4'b0000, 1'b0
104+
Logical-not-equal-1, 4'b0000, !=, 4'b0001, 1'b1
105+
Logical-not-equal-2, 4'b0001, !=, 4'b0000, 1'b1
106+
Logical-not-equal-3, 4'bxxxx, !=, 4'b0001, 1'bx
107+
Logical-not-equal-4, 4'b0001, !=, 4'bxxxx, 1'bx
76108

77109
# shift operation
78110
Shift-left, 5'b00100, <<, 2'b10, 5'b10000

libs/librtlnumber/src/include/internal_bits.hpp

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -219,33 +219,24 @@ namespace BitSpace {
219219
};
220220
_static_unused(l_case_eq)
221221

222-
constexpr bit_value_t l_case_neq[4][4] = unroll_2d_invert(l_case_eq);
223-
_static_unused(l_case_neq)
224-
225222
constexpr bit_value_t l_lt[4][4] = {
226223
/* a / 0 1 x z <-b */
227-
/* 0 */ {_0,_0,_x,_x},
228-
/* 1 */ {_1,_0,_x,_x},
224+
/* 0 */ {_0,_1,_x,_x},
225+
/* 1 */ {_0,_0,_x,_x},
229226
/* x */ {_x,_x,_x,_x},
230227
/* z */ {_x,_x,_x,_x}
231228
};
232229
_static_unused(l_lt)
233230

234-
constexpr bit_value_t l_ge[4][4] = unroll_2d_invert(l_lt);
235-
_static_unused(l_ge)
236-
237231
constexpr bit_value_t l_gt[4][4] = {
238232
/* a / 0 1 x z <-b */
239-
/* 0 */ {_0,_1,_x,_x},
240-
/* 1 */ {_0,_0,_x,_x},
233+
/* 0 */ {_0,_0,_x,_x},
234+
/* 1 */ {_1,_0,_x,_x},
241235
/* x */ {_x,_x,_x,_x},
242236
/* z */ {_x,_x,_x,_x}
243237
};
244238
_static_unused(l_gt)
245239

246-
constexpr bit_value_t l_le[4][4] = unroll_2d_invert(l_gt);
247-
_static_unused(l_le)
248-
249240
constexpr bit_value_t l_eq[4][4] = unroll_2d(l_xnor);
250241
_static_unused(l_eq)
251242

@@ -362,7 +353,7 @@ namespace BitSpace {
362353
private:
363354

364355
std::vector<BitFields<veri_internal_bits_t>> bits;
365-
size_t bit_size;
356+
size_t bit_size = 0;
366357

367358
size_t to_index(size_t address)
368359
{
@@ -380,6 +371,8 @@ namespace BitSpace {
380371

381372
VerilogBits()
382373
{
374+
this->bit_size = 0;
375+
this->bits = std::vector<BitSpace::BitFields<veri_internal_bits_t>>();
383376
}
384377

385378
VerilogBits(size_t data_size, bit_value_t value_in)
@@ -602,9 +595,9 @@ namespace BitSpace {
602595
class VNumber
603596
{
604597
private:
605-
bool sign;
606-
bool defined_size;
607-
BitSpace::VerilogBits bitstring;
598+
bool sign = false;
599+
bool defined_size = false;
600+
BitSpace::VerilogBits bitstring = BitSpace::VerilogBits(1, BitSpace::_x);
608601

609602
VNumber(BitSpace::VerilogBits other_bitstring, bool other_sign)
610603
{
@@ -614,7 +607,12 @@ class VNumber
614607

615608
public:
616609

617-
VNumber(){}
610+
VNumber()
611+
{
612+
this->sign = false;
613+
this->bitstring = BitSpace::VerilogBits(1, BitSpace::_x);
614+
this->defined_size = false;
615+
}
618616

619617
VNumber(VNumber&&) = default;
620618
VNumber& operator=(VNumber&&) = default;

libs/librtlnumber/src/rtl_int.cpp

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -99,26 +99,24 @@ static compare_bit eval_op(VNumber& a_in, VNumber& b_in)
9999
bit_b = b.get_bit_from_lsb(i);
100100
}
101101

102-
103-
if(bit_a == BitSpace::_x || bit_b == BitSpace::_x)
102+
if(BitSpace::l_lt[bit_a][bit_b] == BitSpace::_1)
104103
{
105-
106-
return UNK_EVAL;
104+
return (!invert_result)? LT_EVAL: GT_EVAL;
107105
}
108-
else if(bit_a != bit_b)
106+
else if(BitSpace::l_gt[bit_a][bit_b] == BitSpace::_1)
109107
{
110-
if(bit_a == BitSpace::_1)
111-
{
112-
return (invert_result)? LT_EVAL: GT_EVAL;
113-
}
114-
else
115-
{
116-
return (invert_result)? GT_EVAL: LT_EVAL;
117-
}
108+
return (!invert_result)? GT_EVAL: LT_EVAL;
109+
}
110+
else if(BitSpace::l_eq[bit_a][bit_b] == BitSpace::_1)
111+
{
112+
continue;
113+
}
114+
else
115+
{
116+
return UNK_EVAL;
118117
}
119118
}
120119

121-
122120
return EQ_EVAL;
123121
}
124122

@@ -398,47 +396,47 @@ VNumber V_LT(VNumber& a, VNumber& b)
398396
{
399397
compare_bit cmp = eval_op(a,b);
400398
BitSpace::bit_value_t result = cmp.is_unk()? BitSpace::_x: cmp.is_lt()? BitSpace::_1: BitSpace::_0;
401-
VNumber to_return(1, result, is_signed_operation(a, b));
399+
VNumber to_return(1, result, false);
402400
return to_return;
403401
}
404402

405403
VNumber V_GT(VNumber& a, VNumber& b)
406404
{
407405
compare_bit cmp = eval_op(a,b);
408406
BitSpace::bit_value_t result = cmp.is_unk()? BitSpace::_x: cmp.is_gt()? BitSpace::_1: BitSpace::_0;
409-
VNumber to_return(1, result, is_signed_operation(a, b));
407+
VNumber to_return(1, result, false);
410408
return to_return;
411409
}
412410

413411
VNumber V_EQUAL(VNumber& a, VNumber& b)
414412
{
415413
compare_bit cmp = eval_op(a,b);
416414
BitSpace::bit_value_t result = cmp.is_unk()? BitSpace::_x: cmp.is_eq()? BitSpace::_1: BitSpace::_0;
417-
VNumber to_return(1, result, is_signed_operation(a, b));
415+
VNumber to_return(1, result, false);
418416
return to_return;
419417
}
420418

421419
VNumber V_GE(VNumber& a, VNumber& b)
422420
{
423421
compare_bit cmp = eval_op(a,b);
424422
BitSpace::bit_value_t result = cmp.is_unk()? BitSpace::_x: cmp.is_ge()? BitSpace::_1: BitSpace::_0;
425-
VNumber to_return(1, result, is_signed_operation(a, b));
423+
VNumber to_return(1, result, false);
426424
return to_return;
427425
}
428426

429427
VNumber V_LE(VNumber& a, VNumber& b)
430428
{
431429
compare_bit cmp = eval_op(a,b);
432430
BitSpace::bit_value_t result = cmp.is_unk()? BitSpace::_x: cmp.is_le()? BitSpace::_1: BitSpace::_0;
433-
VNumber to_return(1, result, is_signed_operation(a, b));
431+
VNumber to_return(1, result, false);
434432
return to_return;
435433
}
436434

437435
VNumber V_NOT_EQUAL(VNumber& a, VNumber& b)
438436
{
439437
compare_bit cmp = eval_op(a,b);
440438
BitSpace::bit_value_t result = cmp.is_unk()? BitSpace::_x: cmp.is_ne()? BitSpace::_1: BitSpace::_0;
441-
VNumber to_return(1, result, is_signed_operation(a, b));
439+
VNumber to_return(1, result, false);
442440
return to_return;
443441
}
444442

@@ -447,7 +445,7 @@ VNumber V_SIGNED_SHIFT_LEFT(VNumber& a, VNumber& b)
447445
if(b.is_dont_care_string())
448446
return VNumber("2'sbxx");
449447

450-
return shift_op(a, b.get_value(), true);
448+
return shift_op(a, b.get_value(), a.is_signed());
451449
}
452450

453451
VNumber V_SHIFT_LEFT(VNumber& a, VNumber& b)
@@ -463,7 +461,7 @@ VNumber V_SIGNED_SHIFT_RIGHT(VNumber& a, VNumber& b)
463461
if(b.is_dont_care_string())
464462
return VNumber("2'sbxx");
465463

466-
return shift_op(a, -1* b.get_value(), true);
464+
return shift_op(a, -1* b.get_value(), a.is_signed());
467465
}
468466

469467
VNumber V_SHIFT_RIGHT(VNumber& a, VNumber& b)

0 commit comments

Comments
 (0)