File: struct_dynamic_range.sv

package info (click to toggle)
yosys 0.52-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 69,796 kB
  • sloc: ansic: 696,955; cpp: 239,736; python: 14,617; yacc: 3,529; sh: 2,175; makefile: 1,945; lex: 697; perl: 445; javascript: 323; tcl: 162; vhdl: 115
file content (67 lines) | stat: -rw-r--r-- 1,731 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
module range_shift_mask(
    input logic [2:0] addr_i,
    input logic [7:0] data_i,
    input logic [2:0] addr_o,
    output logic [7:0] data_o
);
    (* nowrshmsk = 0 *)
    struct packed {
        logic [7:0] msb;
        logic [0:3][7:0] data;
        logic [7:0] lsb;
    } s;

    always_comb begin
        s = '1;
        s.data[addr_i] = data_i;
        data_o = s.data[addr_o];
    end
endmodule

module range_case(
    input logic [2:0] addr_i,
    input logic [7:0] data_i,
    input logic [2:0] addr_o,
    output logic [7:0] data_o
);
    (* nowrshmsk = 1 *)
    struct packed {
        logic [7:0] msb;
        logic [0:3][7:0] data;
        logic [7:0] lsb;
    } s;

    always_comb begin
        s = '1;
        s.data[addr_i] = data_i;
        data_o = s.data[addr_o];
    end
endmodule

module top;
    logic [7:0] data_shift_mask1;
    range_shift_mask range_shift_mask1(3'd1, 8'h7e, 3'd1, data_shift_mask1);
    logic [7:0] data_shift_mask2;
    range_shift_mask range_shift_mask2(3'd1, 8'h7e, 3'd2, data_shift_mask2);
    logic [7:0] data_shift_mask3;
    range_shift_mask range_shift_mask3(3'd1, 8'h7e, 3'd4, data_shift_mask3);

    always_comb begin
        assert(data_shift_mask1 === 8'h7e);
        assert(data_shift_mask2 === 8'hff);
        assert(data_shift_mask3 === 8'hxx);
    end

    logic [7:0] data_case1;
    range_case range_case1(3'd1, 8'h7e, 3'd1, data_case1);
    logic [7:0] data_case2;
    range_case range_case2(3'd1, 8'h7e, 3'd2, data_case2);
    logic [7:0] data_case3;
    range_case range_case3(3'd1, 8'h7e, 3'd4, data_case3);

    always_comb begin
        assert(data_case1 === 8'h7e);
        assert(data_case2 === 8'hff);
        assert(data_case3 === 8'hxx);
    end
endmodule