首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用yosys从更高级别的Verilog创建门级Verilog

如何使用yosys从更高级别的Verilog创建门级Verilog
EN

Stack Overflow用户
提问于 2016-11-01 15:58:25
回答 1查看 883关注 0票数 0

我正在尝试从一个用C/C++语言描述的函数生成。我的C函数是一个简单的门:

代码语言:javascript
复制
_Bool and2gate(_Bool a, _Bool b)
{
   return a && b;
}

使用Bambu-Panda工具

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

我成功地生成了这个函数的Verilog描述:

代码语言:javascript
复制
    `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 )。

我知道Yosys的工具允许创建这样的Verilog。然而,我无法达到预期的输出。我想要一份如下格式的输出:

代码语言:javascript
复制
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或其他综合和sim工具从上面的高级verilog生成这种门级代码,我将非常感激。

对于如何从C代码生成Verilog,以及推荐使用哪些工具来完成这样的任务,我也会很感激。

EN

回答 1

Stack Overflow用户

发布于 2016-11-01 16:57:45

我已经将您发布的verilog代码复制到一个文件(and2gate.v)中,并运行了以下yosys命令行:

代码语言:javascript
复制
yosys -p 'synth -flatten -top and2gate; clean -purge; write_verilog -noattr and2gate_syn.v' and2gate.v

这将产生以下输出文件(and2gate_syn.v):

代码语言:javascript
复制
/* 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命令(如help synthhelp write_verilog )的输出,以了解该脚本中使用的各个命令的描述。

具有单个模块的门级Verilog

通常,术语“门级”用于已映射到标准单元库的设计。但是,您尚未提供可映射到的标准单元格库。我认为上面的解决方案非常接近于门级设计,而不需要实际映射到单元库。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40363784

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档