Add support to convert always_comb/latch to vlog95
This commit is contained in:
parent
575aa9b0fb
commit
e611e8acc0
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2011-2013 Cary R. (cygcary@yahoo.com)
|
* Copyright (C) 2011-2017 Cary R. (cygcary@yahoo.com)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -21,6 +21,24 @@
|
||||||
# include "config.h"
|
# include "config.h"
|
||||||
# include "vlog95_priv.h"
|
# include "vlog95_priv.h"
|
||||||
|
|
||||||
|
static unsigned need_ivl_top_module = 0;
|
||||||
|
|
||||||
|
void emit_icarus_generated_top_module()
|
||||||
|
{
|
||||||
|
if (need_ivl_top_module) {
|
||||||
|
fprintf(vlog_out,
|
||||||
|
"\n"
|
||||||
|
"/*\n"
|
||||||
|
" * This module is used to trigger any always_comb or always_latch processes\n"
|
||||||
|
" * at time zero to make sure all the outputs have the correct values.\n"
|
||||||
|
"*/\n"
|
||||||
|
"module IVL_top_priv_module;\n"
|
||||||
|
" event IVL_T0_trigger_event;\n"
|
||||||
|
" initial #0 -> IVL_T0_trigger_event;\n"
|
||||||
|
"endmodule /* IVL_top_priv_module */\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void emit_event(ivl_scope_t scope, ivl_statement_t stmt)
|
void emit_event(ivl_scope_t scope, ivl_statement_t stmt)
|
||||||
{
|
{
|
||||||
unsigned eidx, nevents, first = 1;
|
unsigned eidx, nevents, first = 1;
|
||||||
|
|
@ -68,4 +86,12 @@ void emit_event(ivl_scope_t scope, ivl_statement_t stmt)
|
||||||
emit_id(ivl_event_basename(event));
|
emit_id(ivl_event_basename(event));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If this is an always_comb/latch then we need to add a trigger to
|
||||||
|
* get the correct functionality. */
|
||||||
|
if (ivl_stmt_needs_t0_trigger(stmt)) {
|
||||||
|
assert(first == 0);
|
||||||
|
fprintf(vlog_out, " or IVL_top_priv_module.IVL_T0_trigger_event");
|
||||||
|
need_ivl_top_module = 1;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2010-2016 Cary R. (cygcary@yahoo.com)
|
* Copyright (C) 2010-2017 Cary R. (cygcary@yahoo.com)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -30,7 +30,7 @@
|
||||||
|
|
||||||
static const char*version_string =
|
static const char*version_string =
|
||||||
"Icarus Verilog VLOG95 Code Generator " VERSION " (" VERSION_TAG ")\n\n"
|
"Icarus Verilog VLOG95 Code Generator " VERSION " (" VERSION_TAG ")\n\n"
|
||||||
"Copyright (C) 2010-2015 Cary R. (cygcary@yahoo.com)\n\n"
|
"Copyright (C) 2010-2017 Cary R. (cygcary@yahoo.com)\n\n"
|
||||||
" This program is free software; you can redistribute it and/or modify\n"
|
" This program is free software; you can redistribute it and/or modify\n"
|
||||||
" it under the terms of the GNU General Public License as published by\n"
|
" it under the terms of the GNU General Public License as published by\n"
|
||||||
" the Free Software Foundation; either version 2 of the License, or\n"
|
" the Free Software Foundation; either version 2 of the License, or\n"
|
||||||
|
|
@ -219,9 +219,12 @@ int target_design(ivl_design_t des)
|
||||||
/* Emit any UDP definitions that the design used. */
|
/* Emit any UDP definitions that the design used. */
|
||||||
emit_udp_list();
|
emit_udp_list();
|
||||||
|
|
||||||
/* Emit any UDPs that are Icarus generated (D-FF). */
|
/* Emit any UDPs that are Icarus generated (D-FF or latch). */
|
||||||
emit_icarus_generated_udps();
|
emit_icarus_generated_udps();
|
||||||
|
|
||||||
|
/* Emit the Icarus top module used to trigger translated always_comb/latch processes at T0. */
|
||||||
|
emit_icarus_generated_top_module();
|
||||||
|
|
||||||
/* If there were errors then add this information to the output. */
|
/* If there were errors then add this information to the output. */
|
||||||
if (vlog_errors) {
|
if (vlog_errors) {
|
||||||
fprintf(vlog_out, "\n");
|
fprintf(vlog_out, "\n");
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
#ifndef IVL_vlog95_priv_H
|
#ifndef IVL_vlog95_priv_H
|
||||||
#define IVL_vlog95_priv_H
|
#define IVL_vlog95_priv_H
|
||||||
/*
|
/*
|
||||||
* Copyright (C) 2010-2016 Cary R. (cygcary@yahoo.com)
|
* Copyright (C) 2010-2017 Cary R. (cygcary@yahoo.com)
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
* it under the terms of the GNU General Public License as published by
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
|
@ -106,7 +106,6 @@ extern void emit_nexus_as_ca(ivl_scope_t scope, ivl_nexus_t nex,
|
||||||
extern void emit_nexus_port_driver_as_ca(ivl_scope_t scope, ivl_nexus_t nex);
|
extern void emit_nexus_port_driver_as_ca(ivl_scope_t scope, ivl_nexus_t nex);
|
||||||
extern void emit_const_nexus(ivl_scope_t scope, ivl_net_const_t const_net);
|
extern void emit_const_nexus(ivl_scope_t scope, ivl_net_const_t const_net);
|
||||||
extern void emit_signal_net_const_as_ca(ivl_scope_t scope, ivl_signal_t sig);
|
extern void emit_signal_net_const_as_ca(ivl_scope_t scope, ivl_signal_t sig);
|
||||||
extern void emit_icarus_generated_udps(void);
|
|
||||||
|
|
||||||
extern void add_udp_to_list(ivl_udp_t udp);
|
extern void add_udp_to_list(ivl_udp_t udp);
|
||||||
extern void emit_udp_list(void);
|
extern void emit_udp_list(void);
|
||||||
|
|
@ -118,6 +117,9 @@ extern void emit_number(const char *bits, unsigned nbits, unsigned is_signed,
|
||||||
const char *file, unsigned lineno);
|
const char *file, unsigned lineno);
|
||||||
extern void emit_string(const char *string);
|
extern void emit_string(const char *string);
|
||||||
|
|
||||||
|
extern void emit_icarus_generated_udps(void);
|
||||||
|
extern void emit_icarus_generated_top_module(void);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Find the enclosing module scope.
|
* Find the enclosing module scope.
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue