joe 发表于 2021-9-18 08:29:01

chisel求最大公约数

class RealGCDInput extends Bundle {
val a = UInt(16.W)
val b = UInt(16.W)
}

class RealGCD extends Module {
val io= IO(new Bundle {
    val in= DeqIO(new RealGCDInput())
    val out = Output(Valid(UInt(16.W)))
})

val x = Reg(UInt())
val y = Reg(UInt())
val p = RegInit(false.B)

io.in.ready := !p

when (io.in.valid && !p) {
    x := io.in.bits.a
    y := io.in.bits.b
    p := true.B
}

when (p) {
    when (x > y){ x := y; y := x }
    .otherwise    { y := y - x }
}

io.out.bits:= x
io.out.valid := y === 0.U && p
when (io.out.valid) {
    p := false.B
}
}


joe 发表于 2021-9-18 08:30:41

生成的verilog文件内容如下:
module RealGCD(
input         clock,
input         reset,
output      io_in_ready,
input         io_in_valid,
input io_in_bits_a,
input io_in_bits_b,
output      io_out_valid,
output io_out_bits
);
reg x; // @
reg _RAND_0;
reg y; // @
reg _RAND_1;
regp; // @
reg _RAND_2;
wire_T = ~p; // @
wire_T_2 = io_in_valid & _T; // @
wire_GEN_2 = _T_2 | p; // @
wire_T_3 = x > y; // @
wire _T_5 = y - x; // @
wire_T_6 = y == 16'h0; // @
assign io_in_ready = ~p; // @
assign io_out_valid = _T_6 & p; // @
assign io_out_bits = x; // @
`ifdef RANDOMIZE_GARBAGE_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_INVALID_ASSIGN
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_REG_INIT
`define RANDOMIZE
`endif
`ifdef RANDOMIZE_MEM_INIT
`define RANDOMIZE
`endif
`ifndef RANDOM
`define RANDOM $random
`endif
`ifdef RANDOMIZE_MEM_INIT
integer initvar;
`endif
`ifndef SYNTHESIS
initial begin
`ifdef RANDOMIZE
    `ifdef INIT_RANDOM
      `INIT_RANDOM
    `endif
    `ifndef VERILATOR
      `ifdef RANDOMIZE_DELAY
      #`RANDOMIZE_DELAY begin end
      `else
      #0.002 begin end
      `endif
    `endif
`ifdef RANDOMIZE_REG_INIT
_RAND_0 = {1{`RANDOM}};
x = _RAND_0;
`endif // RANDOMIZE_REG_INIT
`ifdef RANDOMIZE_REG_INIT
_RAND_1 = {1{`RANDOM}};
y = _RAND_1;
`endif // RANDOMIZE_REG_INIT
`ifdef RANDOMIZE_REG_INIT
_RAND_2 = {1{`RANDOM}};
p = _RAND_2;
`endif // RANDOMIZE_REG_INIT
`endif // RANDOMIZE
end // initial
`endif // SYNTHESIS
always @(posedge clock) begin
    if (p) begin
      if (_T_3) begin
      x <= y;
      end else if (_T_2) begin
      x <= io_in_bits_a;
      end
    end else if (_T_2) begin
      x <= io_in_bits_a;
    end
    if (p) begin
      if (_T_3) begin
      y <= x;
      end else begin
      y <= _T_5;
      end
    end else if (_T_2) begin
      y <= io_in_bits_b;
    end
    if (reset) begin
      p <= 1'h0;
    end else if (io_out_valid) begin
      p <= 1'h0;
    end else begin
      p <= _GEN_2;
    end
end
endmodule

joe 发表于 2021-9-18 08:52:28

最大公约数求法中,辗转相除法的基本原理是:两个数的最大公约数等于它们中较小的数和两数之差的最大公约数。
比如252和105的最大公约数:252-105=147 147-105=42105-42=63 63-42=21,所以求出最大公约数为21
页: [1]
查看完整版本: chisel求最大公约数