diff options
Diffstat (limited to 'models/master.v')
-rw-r--r-- | models/master.v | 62 |
1 files changed, 41 insertions, 21 deletions
diff --git a/models/master.v b/models/master.v index 1793fa8..5234efe 100644 --- a/models/master.v +++ b/models/master.v @@ -18,7 +18,7 @@ module master_model #( parameter MASTER_NR = -1, parameter WORD_SIZE = 2, /* in bytes */ - parameter GRANULARITY = 2, /* in bytes */ /* we'll use that soon */ + parameter SEL_LINES = 1, parameter ADR_BITS = 20, parameter OPERATIONS_FILE = "master_operations.mem", parameter OPERATIONS_COUNT = 10 @@ -29,7 +29,7 @@ module master_model output wire [ADR_BITS - 1 : 0] ADR_O, input wire [8*WORD_SIZE - 1 : 0] DAT_I, output wire [8*WORD_SIZE - 1 : 0] DAT_O, - /* output wire [GRANULARITY - 1 : 0] SEL_O, */ /* we'll use that soon */ + output wire [SEL_LINES - 1 : 0] SEL_O, input wire RST_I, output wire STB_O, output wire CYC_O, @@ -41,6 +41,7 @@ module master_model ); parameter WORD_BITS = 8 * WORD_SIZE; + parameter GRANULARITY = WORD_BITS / SEL_LINES; /* in bits */ parameter OP_READ = 0, @@ -52,33 +53,34 @@ module master_model parameter BIGGEST_WIDTH = ADR_BITS > WORD_BITS ? ADR_BITS : WORD_BITS; /* * Contents of this array determine, what this master will do. - * Each (3*n)th element denotes type of operation number n. - * (3*n+1)th element denotes address to use and (3*n+2)th element denotes - * data to use + * Each (4*n)th element denotes type of operation number n. + * (4*n+1)th element denotes address to use, (4*n+2)th element denotes + * data to use and (4*n+3)th element denotes SEL_O mask to use. */ - reg [BIGGEST_WIDTH - 1 : 0] operations [3*OPERATIONS_COUNT - 1 : 0]; + reg [BIGGEST_WIDTH - 1 : 0] operations [4*OPERATIONS_COUNT - 1 : 0]; /* Arrays used for verifying read reaults */ reg was_read [OPERATIONS_COUNT - 1 : 0]; + reg [SEL_LINES - 1 : 0] SEL_mask [OPERATIONS_COUNT - 1 : 0]; reg [WORD_BITS - 1 : 0] expected_data [OPERATIONS_COUNT - 1 : 0]; integer i, j; initial begin - $readmemh(OPERATIONS_FILE, operations, 0, 3*OPERATIONS_COUNT - 1); + $readmemh(OPERATIONS_FILE, operations, 0, 4*OPERATIONS_COUNT - 1); j = 0; for (i = 0; i < OPERATIONS_COUNT; i++) begin - if (operations[3*i][1:0] == OP_READ) begin + if (operations[4*i][1:0] == OP_READ) begin was_read[j] <= 1; - expected_data[j] <= operations[3*i + 2][WORD_BITS - 1 : 0]; + expected_data[j] <= operations[4*i + 2][WORD_BITS - 1 : 0]; + SEL_mask[j] <= operations[4*i + 3][SEL_LINES - 1 : 0]; j++; end - if (operations[3*i][1:0] == OP_WRITE) begin + if (operations[4*i][1:0] == OP_WRITE) begin was_read[j] <= 0; - expected_data[j] <= {(8 * WORD_SIZE - 1){1'bx}}; j++; end @@ -96,6 +98,7 @@ module master_model wire [1:0] current_op_type; wire [ADR_BITS - 1 : 0] current_op_adr; wire [WORD_BITS - 1 : 0] current_op_data; + wire [SEL_LINES - 1 : 0] current_op_mask; wire operation_successful; wire [31:0] operations_performed_next_tick; wire acknowledgement_successful; @@ -108,11 +111,13 @@ module master_model assign deselect_successful = !CYC_O; assign current_op_type - = operations[3*operations_performed][1:0]; + = operations[4*operations_performed][1:0]; assign current_op_adr - = operations[3*operations_performed + 1][ADR_BITS - 1 : 0]; + = operations[4*operations_performed + 1][ADR_BITS - 1 : 0]; assign current_op_data - = operations[3*operations_performed + 2][WORD_BITS - 1 : 0]; + = operations[4*operations_performed + 2][WORD_BITS - 1 : 0]; + assign current_op_mask + = operations[4*operations_performed + 3][SEL_LINES - 1 : 0]; assign operation_successful = operations_performed < OPERATIONS_COUNT && @@ -135,11 +140,13 @@ module master_model wire [1:0] next_op_type; wire [ADR_BITS - 1 : 0] next_op_adr; wire [WORD_BITS - 1 : 0] next_op_data; + wire [SEL_LINES - 1 : 0] next_op_mask; assign idx_to_use = operations_performed_next_tick; - assign next_op_type = operations[3*idx_to_use][1:0]; - assign next_op_adr = operations[3*idx_to_use + 1][ADR_BITS - 1 : 0]; - assign next_op_data = operations[3*idx_to_use + 2][WORD_BITS - 1 : 0]; + assign next_op_type = operations[4*idx_to_use][1:0]; + assign next_op_adr = operations[4*idx_to_use + 1][ADR_BITS - 1 : 0]; + assign next_op_data = operations[4*idx_to_use + 2][WORD_BITS - 1 : 0]; + assign next_op_mask = operations[4*idx_to_use + 3][SEL_LINES - 1 : 0]; /* Drive the outputs */ @@ -155,12 +162,17 @@ module master_model reg [WORD_BITS - 1 : 0] output_data; assign DAT_O = output_data; + reg [SEL_LINES - 1 : 0] mask; + assign SEL_O = mask; + reg [ADR_BITS - 1 : 0] addr; assign ADR_O = addr; reg done; assign finished = done; + reg [WORD_BITS - 1 : 0] masked_data; + initial begin strobe <= 0; cycle <= 0; @@ -221,12 +233,14 @@ module master_model cycle <= 1; strobe <= 1; write_enable <= 0; + mask <= next_op_mask; addr <= next_op_adr; end OP_WRITE : begin cycle <= 1; strobe <= 1; write_enable <= 1; + mask <= next_op_mask; addr <= next_op_adr; output_data <= next_op_data; end @@ -238,16 +252,22 @@ module master_model cycle <= acknowledgements_needed > 0; strobe <= 0; end - endcase // case (operation_to_perform[39:36]) + endcase // case (next_op_type) end // else: !if(operations_performed_next_tick == OPERATIONS_COUNT) if (acknowledgement_successful) begin - if (expected_data[commands_acknowledged] !== DAT_I && + for (i = 0; i < WORD_BITS; i++) begin + masked_data[i] = SEL_mask[commands_acknowledged][i/GRANULARITY] & + DAT_I[i]; + end + + if (expected_data[commands_acknowledged] !== masked_data && was_read[commands_acknowledged]) begin `MSG(("Master %0d: error: read h%x instead of h%x", - MASTER_NR, DAT_I, expected_data[commands_acknowledged])); + MASTER_NR, masked_data, + expected_data[commands_acknowledged])); end - end + end // if (acknowledgement_successful) end // else: !if(RST_I) end // always @ (posedge CLK_I) endmodule // master_model |