2016-11-01 2 views
0

J'essaye de générer le niveau de porte Verilog initialement à partir d'une fonction décrite en langage C/C++. Ma fonction C est une simple et porte:Comment créer un niveau de porte Verilog de niveau supérieur Verilog en utilisant yosys

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

En utilisant l'outil Bambu Panda

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

J'ai réussi à générer une description Verilog de cette fonction:

`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 

Cependant, ce n'est pas un verilog niveau porte que je comprends. Ce que je voudrais faire est de créer un SIMPLE Netlist module Verilog (Gate Level Verilog avec un seul module).

Je comprends que l'outil Yosys permet de créer un tel Verilog. Cependant, je n'ai pas pu atteindre la sortie désirée. Je voudrais une sortie au format fomat suivant:

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

Je vais apprécie beaucoup une explication sur la façon de générer ce genre de code porte Niveau du niveau supérieur Verilog ci-dessus, soit en utilisant Yosys ou d'une autre synthèse et outil sim.

J'apprécierai également toutes les suggestions sur comment générer du code C Verilog et quels outils sont recommandés pour une telle tâche?

Répondre

0

J'ai copié le code Verilog vous affecté à un fichier (and2gate.v) et a couru la yosys ligne de commande suivante:

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

Cela produit le fichier de sortie suivant (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 

Voir la sortie des commandes yosys telles que help synth et help write_verilog pour les descriptions des commandes individuelles utilisées dans ce script.

Porte Niveau Verilog avec un seul module

Généralement, le terme « niveau de la porte » est utilisé pour une conception qui a été mis en correspondance avec une bibliothèque de cellules standard. Toutefois, vous n'avez pas fourni de bibliothèque de cellules standard à mapper. Je pense que la solution ci-dessus est aussi proche qu'on peut arriver à un design de niveau de porte sans cartographier réellement à une bibliothèque de cellules.

+0

CliffordVienna, Merci pour votre réponse. J'ai essayé. 'synth -flatten ...' ne fonctionne pas pour moi - Err: option non supportée. J'ai utilisé 'synth_xilinx -flatten ...' à la place. Y a-t-il une différence? – AlexP

+0

@AlexP synthétiseur fait une synthèse générique, synth_xilinx fait de la synthèse pour FPGA Xilinx 7-Series. Le support pour "synth-flatten" a été ajouté en avril de cette année. Mise à jour à la dernière tête de git. – CliffordVienna