Add simulation-time width assertions to SV interfaces. #128
This commit is contained in:
@@ -2,6 +2,7 @@ from ..base import CpuifBase
|
|||||||
|
|
||||||
class APB3_Cpuif(CpuifBase):
|
class APB3_Cpuif(CpuifBase):
|
||||||
template_path = "apb3_tmpl.sv"
|
template_path = "apb3_tmpl.sv"
|
||||||
|
is_interface = True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_declaration(self) -> str:
|
def port_declaration(self) -> str:
|
||||||
@@ -12,6 +13,8 @@ class APB3_Cpuif(CpuifBase):
|
|||||||
|
|
||||||
|
|
||||||
class APB3_Cpuif_flattened(APB3_Cpuif):
|
class APB3_Cpuif_flattened(APB3_Cpuif):
|
||||||
|
is_interface = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_declaration(self) -> str:
|
def port_declaration(self) -> str:
|
||||||
lines = [
|
lines = [
|
||||||
|
|||||||
@@ -1,3 +1,15 @@
|
|||||||
|
{%- if cpuif.is_interface -%}
|
||||||
|
`ifndef SYNTHESIS
|
||||||
|
initial begin
|
||||||
|
assert($bits({{cpuif.signal("paddr")}}) >= {{ds.package_name}}::{{ds.module_name.upper()}}_MIN_ADDR_WIDTH)
|
||||||
|
else $error("Interface address width of %0d is too small. Shall be at least %0d bits", $bits({{cpuif.signal("paddr")}}), {{ds.package_name}}::{{ds.module_name.upper()}}_MIN_ADDR_WIDTH);
|
||||||
|
assert($bits({{cpuif.signal("pwdata")}}) == {{ds.package_name}}::{{ds.module_name.upper()}}_DATA_WIDTH)
|
||||||
|
else $error("Interface data width of %0d is incorrect. Shall be %0d bits", $bits({{cpuif.signal("pwdata")}}), {{ds.package_name}}::{{ds.module_name.upper()}}_DATA_WIDTH);
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
// Request
|
// Request
|
||||||
logic is_active;
|
logic is_active;
|
||||||
always_ff {{get_always_ff_event(cpuif.reset)}} begin
|
always_ff {{get_always_ff_event(cpuif.reset)}} begin
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from ..base import CpuifBase
|
|||||||
|
|
||||||
class APB4_Cpuif(CpuifBase):
|
class APB4_Cpuif(CpuifBase):
|
||||||
template_path = "apb4_tmpl.sv"
|
template_path = "apb4_tmpl.sv"
|
||||||
|
is_interface = True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_declaration(self) -> str:
|
def port_declaration(self) -> str:
|
||||||
@@ -12,6 +13,8 @@ class APB4_Cpuif(CpuifBase):
|
|||||||
|
|
||||||
|
|
||||||
class APB4_Cpuif_flattened(APB4_Cpuif):
|
class APB4_Cpuif_flattened(APB4_Cpuif):
|
||||||
|
is_interface = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_declaration(self) -> str:
|
def port_declaration(self) -> str:
|
||||||
lines = [
|
lines = [
|
||||||
|
|||||||
@@ -1,3 +1,15 @@
|
|||||||
|
{%- if cpuif.is_interface -%}
|
||||||
|
`ifndef SYNTHESIS
|
||||||
|
initial begin
|
||||||
|
assert($bits({{cpuif.signal("paddr")}}) >= {{ds.package_name}}::{{ds.module_name.upper()}}_MIN_ADDR_WIDTH)
|
||||||
|
else $error("Interface address width of %0d is too small. Shall be at least %0d bits", $bits({{cpuif.signal("paddr")}}), {{ds.package_name}}::{{ds.module_name.upper()}}_MIN_ADDR_WIDTH);
|
||||||
|
assert($bits({{cpuif.signal("pwdata")}}) == {{ds.package_name}}::{{ds.module_name.upper()}}_DATA_WIDTH)
|
||||||
|
else $error("Interface data width of %0d is incorrect. Shall be %0d bits", $bits({{cpuif.signal("pwdata")}}), {{ds.package_name}}::{{ds.module_name.upper()}}_DATA_WIDTH);
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
// Request
|
// Request
|
||||||
logic is_active;
|
logic is_active;
|
||||||
always_ff {{get_always_ff_event(cpuif.reset)}} begin
|
always_ff {{get_always_ff_event(cpuif.reset)}} begin
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ from ...utils import clog2
|
|||||||
|
|
||||||
class Avalon_Cpuif(CpuifBase):
|
class Avalon_Cpuif(CpuifBase):
|
||||||
template_path = "avalon_tmpl.sv"
|
template_path = "avalon_tmpl.sv"
|
||||||
|
is_interface = True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_declaration(self) -> str:
|
def port_declaration(self) -> str:
|
||||||
@@ -17,6 +18,8 @@ class Avalon_Cpuif(CpuifBase):
|
|||||||
return self.addr_width - clog2(self.data_width_bytes)
|
return self.addr_width - clog2(self.data_width_bytes)
|
||||||
|
|
||||||
class Avalon_Cpuif_flattened(Avalon_Cpuif):
|
class Avalon_Cpuif_flattened(Avalon_Cpuif):
|
||||||
|
is_interface = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_declaration(self) -> str:
|
def port_declaration(self) -> str:
|
||||||
lines = [
|
lines = [
|
||||||
|
|||||||
@@ -1,3 +1,15 @@
|
|||||||
|
{%- if cpuif.is_interface -%}
|
||||||
|
`ifndef SYNTHESIS
|
||||||
|
initial begin
|
||||||
|
assert($bits({{cpuif.signal("address")}}) >= {{cpuif.word_addr_width}})
|
||||||
|
else $error("Interface address width of %0d is too small. Shall be at least %0d bits", $bits({{cpuif.signal("address")}}), {{cpuif.word_addr_width}});
|
||||||
|
assert($bits({{cpuif.signal("writedata")}}) == {{ds.package_name}}::{{ds.module_name.upper()}}_DATA_WIDTH)
|
||||||
|
else $error("Interface data width of %0d is incorrect. Shall be %0d bits", $bits({{cpuif.signal("writedata")}}), {{ds.package_name}}::{{ds.module_name.upper()}}_DATA_WIDTH);
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
// Request
|
// Request
|
||||||
always_comb begin
|
always_comb begin
|
||||||
cpuif_req = {{cpuif.signal("read")}} | {{cpuif.signal("write")}};
|
cpuif_req = {{cpuif.signal("read")}} | {{cpuif.signal("write")}};
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ from ..base import CpuifBase
|
|||||||
|
|
||||||
class AXI4Lite_Cpuif(CpuifBase):
|
class AXI4Lite_Cpuif(CpuifBase):
|
||||||
template_path = "axi4lite_tmpl.sv"
|
template_path = "axi4lite_tmpl.sv"
|
||||||
|
is_interface = True
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_declaration(self) -> str:
|
def port_declaration(self) -> str:
|
||||||
@@ -34,6 +35,8 @@ class AXI4Lite_Cpuif(CpuifBase):
|
|||||||
|
|
||||||
|
|
||||||
class AXI4Lite_Cpuif_flattened(AXI4Lite_Cpuif):
|
class AXI4Lite_Cpuif_flattened(AXI4Lite_Cpuif):
|
||||||
|
is_interface = False
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def port_declaration(self) -> str:
|
def port_declaration(self) -> str:
|
||||||
lines = [
|
lines = [
|
||||||
|
|||||||
@@ -1,3 +1,15 @@
|
|||||||
|
{%- if cpuif.is_interface -%}
|
||||||
|
`ifndef SYNTHESIS
|
||||||
|
initial begin
|
||||||
|
assert($bits({{cpuif.signal("araddr")}}) >= {{ds.package_name}}::{{ds.module_name.upper()}}_MIN_ADDR_WIDTH)
|
||||||
|
else $error("Interface address width of %0d is too small. Shall be at least %0d bits", $bits({{cpuif.signal("araddr")}}), {{ds.package_name}}::{{ds.module_name.upper()}}_MIN_ADDR_WIDTH);
|
||||||
|
assert($bits({{cpuif.signal("wdata")}}) == {{ds.package_name}}::{{ds.module_name.upper()}}_DATA_WIDTH)
|
||||||
|
else $error("Interface data width of %0d is incorrect. Shall be %0d bits", $bits({{cpuif.signal("wdata")}}), {{ds.package_name}}::{{ds.module_name.upper()}}_DATA_WIDTH);
|
||||||
|
end
|
||||||
|
`endif
|
||||||
|
|
||||||
|
{% endif -%}
|
||||||
|
|
||||||
// Max Outstanding Transactions: {{cpuif.max_outstanding}}
|
// Max Outstanding Transactions: {{cpuif.max_outstanding}}
|
||||||
logic [{{clog2(cpuif.max_outstanding+1)-1}}:0] axil_n_in_flight;
|
logic [{{clog2(cpuif.max_outstanding+1)-1}}:0] axil_n_in_flight;
|
||||||
logic axil_prev_was_rd;
|
logic axil_prev_was_rd;
|
||||||
|
|||||||
@@ -69,6 +69,7 @@ class CpuifBase:
|
|||||||
"clog2": clog2,
|
"clog2": clog2,
|
||||||
"is_pow2": is_pow2,
|
"is_pow2": is_pow2,
|
||||||
"roundup_pow2": roundup_pow2,
|
"roundup_pow2": roundup_pow2,
|
||||||
|
"ds": self.exp.ds,
|
||||||
}
|
}
|
||||||
|
|
||||||
template = jj_env.get_template(self.template_path)
|
template = jj_env.get_template(self.template_path)
|
||||||
|
|||||||
Reference in New Issue
Block a user