|
今天在看一个chisel代码时发现其中有二句是这样写的:
when(xxx条件) {
x := y
y := x
}
想来想去,这二句产生的verilog代码应该就是伪代码如下:
always @(posedge clk) begin
if(xxx条件) begin
x <= y
y <= x
end
end
查看chisel代码最后生成的verilgo代码如下:
module RealGCD(
input clock,
input reset,
output io_in_ready,
input io_in_valid,
input [15:0] io_in_bits_a,
input [15:0] io_in_bits_b,
output io_out_valid,
output [15:0] io_out_bits
);
reg [15:0] x; // @[RealGCD.scala 17:14]
reg [31:0] _RAND_0;
reg [15:0] y; // @[RealGCD.scala 18:14]
reg [31:0] _RAND_1;
reg p; // @[RealGCD.scala 19:18]
reg [31:0] _RAND_2;
wire _T = ~p; // @[RealGCD.scala 20:18]
wire _T_2 = io_in_valid & _T; // @[RealGCD.scala 21:21]
wire _GEN_2 = _T_2 | p; // @[RealGCD.scala 21:28]
wire _T_3 = x > y; // @[RealGCD.scala 28:13]
wire [15:0] _T_5 = y - x; // @[RealGCD.scala 29:30]
wire _T_6 = y == 16'h0; // @[RealGCD.scala 33:21]
assign io_in_ready = ~p; // @[RealGCD.scala 20:15]
assign io_out_valid = _T_6 & p; // @[RealGCD.scala 33:16]
assign io_out_bits = x; // @[RealGCD.scala 32:16]
`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[15:0];
`endif // RANDOMIZE_REG_INIT
`ifdef RANDOMIZE_REG_INIT
_RAND_1 = {1{`RANDOM}};
y = _RAND_1[15:0];
`endif // RANDOMIZE_REG_INIT
`ifdef RANDOMIZE_REG_INIT
_RAND_2 = {1{`RANDOM}};
p = _RAND_2[0:0];
`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
通过上面红色代码可以看到,verilog代码确实如初始所想。这二句最终的作用是什么呢? 互相赋值相等???
|
|