Move get_always_ff_event() to a more sensible location
This commit is contained in:
@@ -4,7 +4,7 @@ import os
|
|||||||
|
|
||||||
import jinja2 as jj
|
import jinja2 as jj
|
||||||
|
|
||||||
from ..utils import get_always_ff_event, clog2, is_pow2, roundup_pow2
|
from ..utils import clog2, is_pow2, roundup_pow2
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from ..exporter import RegblockExporter
|
from ..exporter import RegblockExporter
|
||||||
@@ -51,7 +51,7 @@ class CpuifBase:
|
|||||||
|
|
||||||
context = {
|
context = {
|
||||||
"cpuif": self,
|
"cpuif": self,
|
||||||
"get_always_ff_event": lambda resetsignal : get_always_ff_event(self.exp.dereferencer, resetsignal),
|
"get_always_ff_event": self.exp.dereferencer.get_always_ff_event,
|
||||||
"get_resetsignal": self.exp.dereferencer.get_resetsignal,
|
"get_resetsignal": self.exp.dereferencer.get_resetsignal,
|
||||||
"clog2": clog2,
|
"clog2": clog2,
|
||||||
"is_pow2": is_pow2,
|
"is_pow2": is_pow2,
|
||||||
|
|||||||
@@ -211,7 +211,7 @@ class Dereferencer:
|
|||||||
"""
|
"""
|
||||||
return self.address_decode.get_external_block_access_strobe(obj)
|
return self.address_decode.get_external_block_access_strobe(obj)
|
||||||
|
|
||||||
def get_resetsignal(self, obj: Optional[SignalNode]) -> str:
|
def get_resetsignal(self, obj: Optional[SignalNode] = None) -> str:
|
||||||
"""
|
"""
|
||||||
Returns a normalized active-high reset signal
|
Returns a normalized active-high reset signal
|
||||||
"""
|
"""
|
||||||
@@ -224,3 +224,12 @@ class Dereferencer:
|
|||||||
|
|
||||||
# default reset signal
|
# default reset signal
|
||||||
return "rst"
|
return "rst"
|
||||||
|
|
||||||
|
def get_always_ff_event(self, resetsignal: Optional[SignalNode] = None) -> str:
|
||||||
|
if resetsignal is None:
|
||||||
|
return "@(posedge clk)"
|
||||||
|
if resetsignal.get_property('async') and resetsignal.get_property('activehigh'):
|
||||||
|
return f"@(posedge clk or posedge {self.get_value(resetsignal)})"
|
||||||
|
elif resetsignal.get_property('async') and not resetsignal.get_property('activehigh'):
|
||||||
|
return f"@(posedge clk or negedge {self.get_value(resetsignal)})"
|
||||||
|
return "@(posedge clk)"
|
||||||
|
|||||||
@@ -10,7 +10,6 @@ from .dereferencer import Dereferencer
|
|||||||
from .readback import Readback
|
from .readback import Readback
|
||||||
from .identifier_filter import kw_filter as kwf
|
from .identifier_filter import kw_filter as kwf
|
||||||
|
|
||||||
from .utils import get_always_ff_event
|
|
||||||
from .scan_design import DesignScanner
|
from .scan_design import DesignScanner
|
||||||
from .validate_design import DesignValidator
|
from .validate_design import DesignValidator
|
||||||
from .cpuif import CpuifBase
|
from .cpuif import CpuifBase
|
||||||
@@ -221,7 +220,7 @@ class RegblockExporter:
|
|||||||
"readback": self.readback,
|
"readback": self.readback,
|
||||||
"ext_write_acks": ext_write_acks,
|
"ext_write_acks": ext_write_acks,
|
||||||
"ext_read_acks": ext_read_acks,
|
"ext_read_acks": ext_read_acks,
|
||||||
"get_always_ff_event": lambda resetsignal : get_always_ff_event(self.dereferencer, resetsignal),
|
"get_always_ff_event": self.dereferencer.get_always_ff_event,
|
||||||
"retime_read_response": retime_read_response,
|
"retime_read_response": retime_read_response,
|
||||||
"retime_read_fanin": retime_read_fanin,
|
"retime_read_fanin": retime_read_fanin,
|
||||||
"min_read_latency": self.min_read_latency,
|
"min_read_latency": self.min_read_latency,
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ from systemrdl.node import RegNode, RegfileNode, MemNode, AddrmapNode
|
|||||||
|
|
||||||
from ..struct_generator import RDLStructGenerator
|
from ..struct_generator import RDLStructGenerator
|
||||||
from ..forloop_generator import RDLForLoopGenerator
|
from ..forloop_generator import RDLForLoopGenerator
|
||||||
from ..utils import get_always_ff_event, get_indexed_path
|
from ..utils import get_indexed_path
|
||||||
from ..identifier_filter import kw_filter as kwf
|
from ..identifier_filter import kw_filter as kwf
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
@@ -228,7 +228,7 @@ class FieldLogicGenerator(RDLForLoopGenerator):
|
|||||||
'extra_combo_signals': extra_combo_signals,
|
'extra_combo_signals': extra_combo_signals,
|
||||||
'conditionals': conditionals,
|
'conditionals': conditionals,
|
||||||
'resetsignal': resetsignal,
|
'resetsignal': resetsignal,
|
||||||
'get_always_ff_event': lambda resetsignal : get_always_ff_event(self.exp.dereferencer, resetsignal),
|
'get_always_ff_event': self.exp.dereferencer.get_always_ff_event,
|
||||||
'get_value': self.exp.dereferencer.get_value,
|
'get_value': self.exp.dereferencer.get_value,
|
||||||
'get_resetsignal': self.exp.dereferencer.get_resetsignal,
|
'get_resetsignal': self.exp.dereferencer.get_resetsignal,
|
||||||
'get_input_identifier': self.exp.hwif.get_input_identifier,
|
'get_input_identifier': self.exp.hwif.get_input_identifier,
|
||||||
@@ -335,7 +335,7 @@ class FieldLogicGenerator(RDLForLoopGenerator):
|
|||||||
"strb": strb,
|
"strb": strb,
|
||||||
"bslice": bslice,
|
"bslice": bslice,
|
||||||
"retime": self.field_logic.retime_external_reg,
|
"retime": self.field_logic.retime_external_reg,
|
||||||
"get_always_ff_event": lambda resetsignal : get_always_ff_event(self.exp.dereferencer, resetsignal),
|
'get_always_ff_event': self.exp.dereferencer.get_always_ff_event,
|
||||||
"get_resetsignal": self.exp.dereferencer.get_resetsignal,
|
"get_resetsignal": self.exp.dereferencer.get_resetsignal,
|
||||||
"resetsignal": self.exp.top_node.cpuif_reset,
|
"resetsignal": self.exp.top_node.cpuif_reset,
|
||||||
}
|
}
|
||||||
@@ -359,7 +359,7 @@ class FieldLogicGenerator(RDLForLoopGenerator):
|
|||||||
"strb": strb,
|
"strb": strb,
|
||||||
"addr_width": addr_width,
|
"addr_width": addr_width,
|
||||||
"retime": retime,
|
"retime": retime,
|
||||||
"get_always_ff_event": lambda resetsignal : get_always_ff_event(self.exp.dereferencer, resetsignal),
|
'get_always_ff_event': self.exp.dereferencer.get_always_ff_event,
|
||||||
"get_resetsignal": self.exp.dereferencer.get_resetsignal,
|
"get_resetsignal": self.exp.dereferencer.get_resetsignal,
|
||||||
"resetsignal": self.exp.top_node.cpuif_reset,
|
"resetsignal": self.exp.top_node.cpuif_reset,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ from typing import TYPE_CHECKING
|
|||||||
import math
|
import math
|
||||||
|
|
||||||
from .generators import ReadbackAssignmentGenerator
|
from .generators import ReadbackAssignmentGenerator
|
||||||
from ..utils import get_always_ff_event
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from ..exporter import RegblockExporter
|
from ..exporter import RegblockExporter
|
||||||
@@ -31,7 +30,7 @@ class Readback:
|
|||||||
context = {
|
context = {
|
||||||
"array_assignments" : array_assignments,
|
"array_assignments" : array_assignments,
|
||||||
"array_size" : array_size,
|
"array_size" : array_size,
|
||||||
"get_always_ff_event": lambda resetsignal : get_always_ff_event(self.exp.dereferencer, resetsignal),
|
'get_always_ff_event': self.exp.dereferencer.get_always_ff_event,
|
||||||
"cpuif": self.exp.cpuif,
|
"cpuif": self.exp.cpuif,
|
||||||
"do_fanin_stage": self.do_fanin_stage,
|
"do_fanin_stage": self.do_fanin_stage,
|
||||||
"has_external_addressable": self.has_external_addressable,
|
"has_external_addressable": self.has_external_addressable,
|
||||||
|
|||||||
@@ -1,15 +1,11 @@
|
|||||||
import re
|
import re
|
||||||
from typing import TYPE_CHECKING, Match, Union
|
from typing import Match, Union
|
||||||
|
|
||||||
from systemrdl.rdltypes.references import PropertyReference
|
from systemrdl.rdltypes.references import PropertyReference
|
||||||
from systemrdl.node import Node, SignalNode, AddrmapNode
|
from systemrdl.node import Node, AddrmapNode
|
||||||
|
|
||||||
from .identifier_filter import kw_filter as kwf
|
from .identifier_filter import kw_filter as kwf
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
|
||||||
from typing import Optional
|
|
||||||
from .dereferencer import Dereferencer
|
|
||||||
|
|
||||||
def get_indexed_path(top_node: Node, target_node: Node) -> str:
|
def get_indexed_path(top_node: Node, target_node: Node) -> str:
|
||||||
"""
|
"""
|
||||||
TODO: Add words about indexing and why i'm doing this. Copy from logbook
|
TODO: Add words about indexing and why i'm doing this. Copy from logbook
|
||||||
@@ -33,16 +29,6 @@ def get_indexed_path(top_node: Node, target_node: Node) -> str:
|
|||||||
|
|
||||||
return path
|
return path
|
||||||
|
|
||||||
|
|
||||||
def get_always_ff_event(dereferencer: 'Dereferencer', resetsignal: 'Optional[SignalNode]') -> str:
|
|
||||||
if resetsignal is None:
|
|
||||||
return "@(posedge clk)"
|
|
||||||
if resetsignal.get_property('async') and resetsignal.get_property('activehigh'):
|
|
||||||
return f"@(posedge clk or posedge {dereferencer.get_value(resetsignal)})"
|
|
||||||
elif resetsignal.get_property('async') and not resetsignal.get_property('activehigh'):
|
|
||||||
return f"@(posedge clk or negedge {dereferencer.get_value(resetsignal)})"
|
|
||||||
return "@(posedge clk)"
|
|
||||||
|
|
||||||
def clog2(n: int) -> int:
|
def clog2(n: int) -> int:
|
||||||
return (n-1).bit_length()
|
return (n-1).bit_length()
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ from systemrdl.component import Reg
|
|||||||
from systemrdl.node import RegNode
|
from systemrdl.node import RegNode
|
||||||
|
|
||||||
from ..forloop_generator import RDLForLoopGenerator
|
from ..forloop_generator import RDLForLoopGenerator
|
||||||
from ..utils import get_always_ff_event
|
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from . import WriteBuffering
|
from . import WriteBuffering
|
||||||
@@ -54,7 +53,7 @@ class WBufLogicGenerator(RDLForLoopGenerator):
|
|||||||
'node': node,
|
'node': node,
|
||||||
'cpuif': self.exp.cpuif,
|
'cpuif': self.exp.cpuif,
|
||||||
'get_resetsignal': self.exp.dereferencer.get_resetsignal,
|
'get_resetsignal': self.exp.dereferencer.get_resetsignal,
|
||||||
'get_always_ff_event': lambda resetsignal : get_always_ff_event(self.exp.dereferencer, resetsignal),
|
'get_always_ff_event': self.exp.dereferencer.get_always_ff_event,
|
||||||
'is_own_trigger': is_own_trigger,
|
'is_own_trigger': is_own_trigger,
|
||||||
}
|
}
|
||||||
self.add_content(self.template.render(context))
|
self.add_content(self.template.render(context))
|
||||||
|
|||||||
@@ -7,11 +7,11 @@ Testcases require an installation of the Questa simulator, and for `vlog` & `vsi
|
|||||||
commands to be visible via the PATH environment variable.
|
commands to be visible via the PATH environment variable.
|
||||||
|
|
||||||
*Questa - Intel FPGA Starter Edition* can be downloaded for free from Intel:
|
*Questa - Intel FPGA Starter Edition* can be downloaded for free from Intel:
|
||||||
* Go to https://www.intel.com/content/www/us/en/collections/products/fpga/software/downloads.html?edition=pro&s=Newest
|
* Go to https://www.intel.com/content/www/us/en/collections/products/fpga/software/downloads.html?edition=pro&q=questa&s=Relevancy
|
||||||
* Select latest version of *Intel Quartus Prime Pro*
|
* Select latest version of Questa
|
||||||
* Go to the *Individual Files* tab.
|
|
||||||
* Download Questa files. (Don't forget part 2!)
|
* Download Questa files. (Don't forget part 2!)
|
||||||
* Install
|
* Install
|
||||||
|
* Be sure to choose "Starter Edition" for the free version.
|
||||||
* Create an account on https://licensing.intel.com
|
* Create an account on https://licensing.intel.com
|
||||||
* press "Enroll" to register
|
* press "Enroll" to register
|
||||||
* After you confirm your email, go back to this page and press "Enroll" again to finish enrollment
|
* After you confirm your email, go back to this page and press "Enroll" again to finish enrollment
|
||||||
@@ -19,6 +19,9 @@ commands to be visible via the PATH environment variable.
|
|||||||
* Generate a free *Starter Edition* license file for Questa
|
* Generate a free *Starter Edition* license file for Questa
|
||||||
* Easiest to use a *fixed* license using your NIC ID (MAC address of your network card via `ifconfig`)
|
* Easiest to use a *fixed* license using your NIC ID (MAC address of your network card via `ifconfig`)
|
||||||
* Download the license file and point the `LM_LICENSE_FILE` environment variable to the folder which contains it.
|
* Download the license file and point the `LM_LICENSE_FILE` environment variable to the folder which contains it.
|
||||||
|
* (optional) Delete Intel libraries to save some disk space
|
||||||
|
* Delete `<install_dir>/questa_fse/intel`
|
||||||
|
* Edit `<install_dir>/questa_fse/modelsim.ini` and remove lines that reference the `intel` libraries
|
||||||
|
|
||||||
|
|
||||||
## Vivado (optional)
|
## Vivado (optional)
|
||||||
|
|||||||
Reference in New Issue
Block a user