4 output mem_valid_a, mem_valid_b,
5 output mem_instr_a, mem_instr_b,
6 input mem_ready_a, mem_ready_b,
7 output [31:0] mem_addr_a, mem_addr_b,
8 output [31:0] mem_wdata_a, mem_wdata_b,
9 output [ 3:0] mem_wstrb_a, mem_wstrb_b,
10 input [31:0] mem_rdata_a, mem_rdata_b
18 .mem_valid (mem_valid_a),
19 .mem_instr (mem_instr_a),
20 .mem_ready (mem_ready_a),
21 .mem_addr (mem_addr_a ),
22 .mem_wdata (mem_wdata_a),
23 .mem_wstrb (mem_wstrb_a),
24 .mem_rdata (mem_rdata_a)
33 .mem_valid (mem_valid_b),
34 .mem_instr (mem_instr_b),
35 .mem_ready (mem_ready_b),
36 .mem_addr (mem_addr_b ),
37 .mem_wdata (mem_wdata_b),
38 .mem_wstrb (mem_wstrb_b),
39 .mem_rdata (mem_rdata_b)
42 reg [31:0] rom [0:255];
44 integer mem_access_cnt_a = 0;
45 integer mem_access_cnt_b = 0;
48 assume(resetn == !$initstate);
51 // only consider programs without data memory read/write
52 if (mem_valid_a) assume(mem_instr_a);
53 if (mem_valid_b) assume(mem_instr_b);
55 // when the access cnt matches, the addresses must match
56 if (mem_valid_a && mem_valid_b && mem_access_cnt_a == mem_access_cnt_b) begin
57 assert(mem_addr_a == mem_addr_b);
61 assume(mem_rdata_a == rom[mem_addr_a[9:2]]);
62 assume(mem_rdata_b == rom[mem_addr_b[9:2]]);
65 // it will pass when this is enabled
66 //assume(mem_ready_a == mem_ready_b);
69 always @(posedge clock) begin
70 mem_access_cnt_a <= mem_access_cnt_a + (resetn && mem_valid_a && mem_ready_a);
71 mem_access_cnt_b <= mem_access_cnt_b + (resetn && mem_valid_b && mem_ready_b);