처음에 C/C++ 언어로 설명 된 함수에서 게이트 레벨 Verilog를 생성하려고합니다.yosys를 사용하여 상위 레벨 Verilog에서 게이트 레벨 Verilog를 만드는 방법
_Bool and2gate(_Bool a, _Bool b)
{
return a && b;
}
I이 함수의 Verilog를 설명 생성하는 관리
밤부-팬더 도구를 사용 :
`ifdef __ICARUS__
`define _SIM_HAVE_CLOG2
`endif
`ifdef VERILATOR
`define _SIM_HAVE_CLOG2
`endif
`ifdef MODEL_TECH
`define _SIM_HAVE_CLOG2
`endif
`ifdef VCS
`define _SIM_HAVE_CLOG2
`endif
`ifdef NCVERILOG
`define _SIM_HAVE_CLOG2
`endif
`ifdef XILINX_SIMULATOR
`define _SIM_HAVE_CLOG2
`endif
`ifdef XILINX_ISIM
`define _SIM_HAVE_CLOG2
`endif
`timescale 1ns/1ps
module ui_bit_and_expr_FU(in1, in2, out1);
parameter BITSIZE_in1=1, BITSIZE_in2=1, BITSIZE_out1=1;
// IN
input [BITSIZE_in1-1:0] in1;
input [BITSIZE_in2-1:0] in2;
// OUT
output [BITSIZE_out1-1:0] out1;
assign out1 = in1 & in2;
endmodule
// Datapath RTL descrition for and2gate
`timescale 1ns/1ps
module datapath_and2gate(clock, reset, in_port_a, in_port_b, return_port);
// IN
input clock;
input reset;
input in_port_a;
input in_port_b;
// OUT
output return_port;
// Component and signal declarations
wire [0:0] out_ui_bit_and_expr_FU_1_1_1_3_i0_fu_and2gate_21644_21668;
ui_bit_and_expr_FU #(.BITSIZE_in1(1), .BITSIZE_in2(1), .BITSIZE_out1(1)) fu_and2gate_21644_21668 (.out1(out_ui_bit_and_expr_FU_1_1_1_3_i0_fu_and2gate_21644_21668), .in1(in_port_a), .in2(in_port_b));
// io-signal post fix
assign return_port = out_ui_bit_and_expr_FU_1_1_1_3_i0_fu_and2gate_21644_21668;
endmodule
// FSM based controller descrition for and2gate
`timescale 1ns/1ps
module controller_and2gate(done_port, clock, reset, start_port);
// IN
input clock;
input reset;
input start_port;
// OUT
output done_port;
parameter [0:0] S_0 = 1'd0;
reg [0:0] _present_state, _next_state;
reg done_port;
always @(posedge clock)
if (reset == 1'b0) _present_state <= S_0;
else _present_state <= _next_state;
always @(*)
begin
_next_state = S_0;
done_port = 1'b0;
case (_present_state)
S_0 :
if(start_port != 1'b1)
begin
_next_state = S_0;
end
else
begin
_next_state = S_0;
done_port = 1'b1;
end
default :
begin
done_port = 1'b0;
end
endcase
end
endmodule
// Top component for and2gate
`timescale 1ns/1ps
module and2gate(clock, reset, start_port, done_port, a, b, return_port);
// IN
input clock;
input reset;
input start_port;
input a;
input b;
// OUT
output done_port;
output return_port;
// Component and signal declarations
controller_and2gate Controller_i (.done_port(done_port), .clock(clock),
.reset(reset), .start_port(start_port));
datapath_and2gate Datapath_i (.return_port(return_port), .clock(clock),
.reset(reset), .in_port_a(a), .in_port_b(b));
endmodule
// Minimal interface for top component: and2gate
`timescale 1ns/1ps
module and2gate_minimal_interface(clock, reset, start_port, a, b, done_port, return_port);
// IN
input clock;
input reset;
input start_port;
input a;
input b;
// OUT
output done_port;
output return_port;
// Component and signal declarations
and2gate and2gate_i0 (.done_port(done_port), .return_port(return_port), .clock(clock), .reset(reset), .start_port(start_port), .a(a), .b(b));
endmodule
내 C 함수는 단순하고 관문
그러나 이것은 내가 이해하는 게이트 레벨의 Verilog가 아닙니다. 내가 뭘하고 싶은가 단일 모듈 Netlist Verilog (단일 모듈로 게이트 레벨 Verilog)를 만드는 것입니다.
Yosys 도구로 Verilog를 만들 수 있다는 것을 알고 있습니다. 그러나 원하는 출력에 도달 할 수 없습니다. 하나 Yosys 또는 다른 합성을 사용하여,
module top (input clk, // clock
input rst, // reset
input g_init, //for sequential circuits, initial value for
registers from garbler. Only read in first clock cycle
input e_init, //same for evaluator
input g_input, // garbler's input
input e_input,//evaluator's input
output o // output
);
내가 위의 높은 수준을 Verilog에서 게이트 레벨 이러한 종류의 코드를 생성하는 방법에 매우 설명을 감사 할 것 : 나는 다음과 같은 fomat 형식으로 출력을 싶습니다 및 sim 도구.
또한 C 코드에서 Verilog을 생성하는 방법에 대한 제안과 이러한 도구에 권장되는 도구를 알려 주시면 감사하겠습니다.
클리포드 비엔나, 답변 해 주셔서 감사합니다. 나는 노력했다. 'synth-flatten ...'이 나를 위해 작동하지 않습니다. - Err : 지원되지 않는 옵션입니다. 대신 'synth_xilinx -flatten ...'을 사용했습니다. 어떤 차이가 있습니까? – AlexP
@AlexP synth는 제네릭 합성을 수행하며, synth_xilinx는 Xilinx 7 시리즈 FPGA 용 합성을 수행합니다. 올해 4 월에는 "synth-flatten"에 대한 지원이 추가되었습니다. 최신 git 헤드로 업데이트하십시오. – CliffordVienna