- module alu_t (
- input Reset_n_i,
- input Clk_i,
- input [1:0] Opc_i,
- input [31:0] DinA_i,
- input [31:0] DinB_i,
- output [31:0] Dout_o,
- output OverFlow_o
- );
-
-
- `define OPC_ADD 0
- `define OPC_SUB 1
- `define OPC_AND 2
- `define OPC_OR 3
-
-
- alu alu_i (
- .Reset_n_i(Reset_n_i),
- .Clk_i(Clk_i),
- .Opc_i(Opc_i),
- .DinA_i(DinA_i),
- .DinB_i(DinB_i),
- .Dout_o(Dout_o),
- .OverFlow_o(OverFlow_o)
- );
-
-
- reg init_state = 1;
-
- // Initial reset
- always @(*) begin
- if (init_state) assume (!Reset_n_i);
- if (!init_state) assume (Reset_n_i);
- end
-
- always @(posedge Clk_i)
- init_state = 0;
-
-
- bit unsigned [32:0] dina, dinb;
-
- assign dina = DinA_i;
- assign dinb = DinB_i;
-
- assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_ADD |=> Dout_o == ($past(DinA_i) + $past(DinB_i)));
- assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_ADD && (dina + dinb) > 2**32-1 |=> OverFlow_o);
- assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_SUB |=> Dout_o == ($past(DinA_i) - $past(DinB_i)));
- assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_SUB && (dina - dinb) > 2**32-1 |=> OverFlow_o);
- assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_AND |=> Dout_o == ($past(DinA_i) & $past(DinB_i)));
- assert property (@(posedge Clk_i) disable iff (!Reset_n_i) Opc_i == `OPC_OR |=> Dout_o == ($past(DinA_i) | $past(DinB_i)));
-
- always @(*)
- if (!Reset_n_i) assert (Dout_o == 0);
-
- property cover_opc (opc);
- @(posedge Clk_i)
- disable iff (!Reset_n_i) Opc_i == opc;
- endproperty
-
- cover property (cover_opc(`OPC_ADD));
- cover property (cover_opc(`OPC_SUB));
- cover property (cover_opc(`OPC_AND));
- cover property (cover_opc(`OPC_OR));
-
-
- endmodule
-
|