2016-11-01 6 views
0

처음에 C/C++ 언어로 설명 된 함수에서 게이트 레벨 Verilog를 생성하려고합니다.yosys를 사용하여 상위 레벨 Verilog에서 게이트 레벨 Verilog를 만드는 방법

_Bool and2gate(_Bool a, _Bool b) 
{ 
    return a && b; 
} 

I이 함수의 Verilog를 설명 생성하는 관리

http://panda.dei.polimi.it/

밤부-팬더 도구를 사용 :

`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을 생성하는 방법에 대한 제안과 이러한 도구에 권장되는 도구를 알려 주시면 감사하겠습니다.

답변

0

난 당신이 파일에 게시 된 Verilog 코드 (and2gate.v)를 복사 한 다음 yosys 명령 줄 실행 한 :

/* Generated by Yosys 0.6+337 (git sha1 81bdf0a, clang 3.8.0-2ubuntu4 -fPIC -Os) */ 

module and2gate(clock, reset, start_port, done_port, a, b, return_port); 
    input a; 
    input b; 
    input clock; 
    output done_port; 
    input reset; 
    output return_port; 
    input start_port; 
    assign return_port = b & a; 
    assign done_port = start_port; 
endmodule 

:

yosys -p 'synth -flatten -top and2gate; clean -purge; write_verilog -noattr and2gate_syn.v' and2gate.v 

이 다음과 같은 출력 파일 (and2gate_syn.v을) 생산을 해당 스크립트에 사용 된 개별 명령에 대한 설명은 help synthhelp write_verilog과 같은 yosys 명령의 출력을 참조하십시오. 하나의 모듈

일반적 용어는 "게이트 레벨"을

게이트 수준의 Verilog는 표준 셀 라이브러리에 매핑 된 디자인에 사용됩니다. 그러나 매핑 할 표준 셀 라이브러리를 제공하지 않았습니다. 위의 솔루션은 실제로 셀 라이브러리에 매핑하지 않고도 게이트 레벨 디자인에 가깝게 접근 할 수 있다고 생각합니다.

+0

클리포드 비엔나, 답변 해 주셔서 감사합니다. 나는 노력했다. 'synth-flatten ...'이 나를 위해 작동하지 않습니다. - Err : 지원되지 않는 옵션입니다. 대신 'synth_xilinx -flatten ...'을 사용했습니다. 어떤 차이가 있습니까? – AlexP

+0

@AlexP synth는 제네릭 합성을 수행하며, synth_xilinx는 Xilinx 7 시리즈 FPGA 용 합성을 수행합니다. 올해 4 월에는 "synth-flatten"에 대한 지원이 추가되었습니다. 최신 git 헤드로 업데이트하십시오. – CliffordVienna

관련 문제