2016-11-01 3 views
0

最初にC/C++言語で記述された関数からゲートレベルのVerilogを生成しようとしています。私のCの関数は、シンプルかつゲートである:yosysを使用して上位レベルのVerilogからゲートレベルのVerilogを作成する方法

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

バンブーパンダツール

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

を使用して、私は、この関数の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 

しかし、これはゲートレベルのVerilogではわかりません。私がしたいのは、単一モジュールネットリストVerilog(単一モジュールでゲートレベルVerilog)を作成することです。

私はYosysツールでこのようなVerilogを作成できることを理解しています。しかし、私は希望の出力に到達できませんでした。私は非常に上記の高レベルのverilogからゲートレベルのこの種のコードを生成する方法についての説明を感謝します

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 
); 

、どちらかYosysまたはいくつかの他の合成を使用して:私は、次のfomat形式で出力したいと思いますとシムツール。

また、CコードからVerilogを生成する方法や、そのようなタスクに推奨されるツールについては、お勧めしますか?

私はあなたがファイル( and2gate.v)に掲載し、次のyosysのコマンドラインを実行したVerilogコードをコピーした

答えて

0

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

これは、次の出力ファイル(and2gate_syn.v)生産:

/* 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 

をそのスクリプトで使用される個々のコマンドの説明については、help synthおよびhelp write_verilogなどのyosysコマンドの出力を参照してください。単一のモジュール

通常用語「ゲートレベル」と

ゲートレベルのVerilogは、標準セルライブラリにマッピングされている設計に使用されます。ただし、マップする標準のセルライブラリは提供していません。私は上記の解決策は、実際にセルライブラリにマッピングせずにゲートレベルの設計に近づけることができると考えています。

+0

CliffordVienna、ありがとうございます。 私は試しました。 'synth-flatten ...'は私にとってはうまくいかない - Err:サポートされていないオプション。 代わりに、 'synth_xilinx -flatten ...'を使用しました。違いはありますか? – AlexP

+0

@AlexPシンセは汎用シンセサイザであり、synth_xilinxはザイリンクス7シリーズFPGAの合成を行います。今年4月には「シンセ・フラッテン」のサポートが追加されました。最新のgit headに更新してください。 – CliffordVienna

関連する問題