Skip to content

Commit 4dee118

Browse files
authored
Merge pull request #637 from diffblue/indexed-part-select5
Verilog: fix synthesis for assignment to indexed part select
2 parents f3569b9 + 862bdf7 commit 4dee118

File tree

3 files changed

+26
-4
lines changed

3 files changed

+26
-4
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
indexed-part-select5.sv
3+
--bound 0
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
--
7+
^warning: ignoring
8+
--
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
module main(input my_input);
2+
3+
bit [7:0] some_wire;
4+
5+
always @my_input begin
6+
some_wire[0 +: 2] = 'b01;
7+
some_wire[2 +: 2] = 'b01;
8+
some_wire[4 +: 2] = 'b01;
9+
some_wire[6 +: 2] = 'b01;
10+
end
11+
12+
p0: assert final (some_wire == 'b01_01_01_01);
13+
14+
endmodule

src/verilog/verilog_synthesis.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -364,12 +364,12 @@ exprt verilog_synthesist::synth_expr(exprt expr, symbol_statet symbol_state)
364364
if(part_select.id() == ID_verilog_indexed_part_select_plus)
365365
{
366366
bottom = index_int - src_offset;
367-
top = bottom + width;
367+
top = bottom + width - 1;
368368
}
369369
else // ID_verilog_indexed_part_select_minus
370370
{
371371
top = index_int - src_offset;
372-
bottom = bottom - width;
372+
bottom = bottom - width + 1;
373373
}
374374

375375
return extractbits_exprt{
@@ -1091,7 +1091,7 @@ void verilog_synthesist::assignment_rec(
10911091

10921092
// We drop bits that are out of bounds
10931093
auto from_in_range = std::max(mp_integer{0}, index);
1094-
auto to_in_range = std::min(rhs_width - 1, index + width);
1094+
auto to_in_range = std::min(rhs_width - 1, index + width - 1);
10951095

10961096
// now add the indexes in the range
10971097
for(mp_integer i = from_in_range; i <= to_in_range; ++i)
@@ -1342,7 +1342,7 @@ void verilog_synthesist::assignment_member_rec(
13421342
member.push_back(mp_integer());
13431343

13441344
// now add the indexes in the range
1345-
for(mp_integer i = index; i <= index + width; ++i)
1345+
for(mp_integer i = index; i <= index + width - 1; ++i)
13461346
{
13471347
// do the value
13481348
member.back() = i;

0 commit comments

Comments
 (0)