mirror of
https://github.com/YosysHQ/yosys
synced 2025-04-12 20:18:20 +00:00
verilog: fix $specify3 check
This commit is contained in:
parent
cb7bc6a12f
commit
7cfdf4ffa7
|
@ -1559,21 +1559,25 @@ RTLIL::SigSpec AstNode::genRTLIL(int width_hint, bool sign_hint)
|
||||||
log_file_error(filename, linenum, "Attribute `%s' with non-constant value.\n", attr.first.c_str());
|
log_file_error(filename, linenum, "Attribute `%s' with non-constant value.\n", attr.first.c_str());
|
||||||
cell->attributes[attr.first] = attr.second->asAttrConst();
|
cell->attributes[attr.first] = attr.second->asAttrConst();
|
||||||
}
|
}
|
||||||
if (cell->type.in("$specify2", "$specify3")) {
|
if (cell->type == "$specify2") {
|
||||||
int src_width = GetSize(cell->getPort("\\SRC"));
|
int src_width = GetSize(cell->getPort("\\SRC"));
|
||||||
int dst_width = GetSize(cell->getPort("\\DST"));
|
int dst_width = GetSize(cell->getPort("\\DST"));
|
||||||
bool full = cell->getParam("\\FULL").as_bool();
|
bool full = cell->getParam("\\FULL").as_bool();
|
||||||
if (!full && src_width != dst_width)
|
if (!full && src_width != dst_width)
|
||||||
log_file_error(filename, linenum, "Parallel specify SRC width does not match DST width.\n");
|
log_file_error(filename, linenum, "Parallel specify SRC width does not match DST width.\n");
|
||||||
if (cell->type == "$specify3") {
|
|
||||||
int dat_width = GetSize(cell->getPort("\\DAT"));
|
|
||||||
if (dat_width != dst_width)
|
|
||||||
log_file_error(filename, linenum, "Specify DAT width does not match DST width.\n");
|
|
||||||
}
|
|
||||||
cell->setParam("\\SRC_WIDTH", Const(src_width));
|
cell->setParam("\\SRC_WIDTH", Const(src_width));
|
||||||
cell->setParam("\\DST_WIDTH", Const(dst_width));
|
cell->setParam("\\DST_WIDTH", Const(dst_width));
|
||||||
}
|
}
|
||||||
if (cell->type == "$specrule") {
|
else if (cell->type == "$specify3") {
|
||||||
|
int dat_width = GetSize(cell->getPort("\\DAT"));
|
||||||
|
int dst_width = GetSize(cell->getPort("\\DST"));
|
||||||
|
if (dat_width != dst_width)
|
||||||
|
log_file_error(filename, linenum, "Specify DAT width does not match DST width.\n");
|
||||||
|
int src_width = GetSize(cell->getPort("\\SRC"));
|
||||||
|
cell->setParam("\\SRC_WIDTH", Const(src_width));
|
||||||
|
cell->setParam("\\DST_WIDTH", Const(dst_width));
|
||||||
|
}
|
||||||
|
else if (cell->type == "$specrule") {
|
||||||
int src_width = GetSize(cell->getPort("\\SRC"));
|
int src_width = GetSize(cell->getPort("\\SRC"));
|
||||||
int dst_width = GetSize(cell->getPort("\\DST"));
|
int dst_width = GetSize(cell->getPort("\\DST"));
|
||||||
cell->setParam("\\SRC_WIDTH", Const(src_width));
|
cell->setParam("\\SRC_WIDTH", Const(src_width));
|
||||||
|
|
|
@ -37,3 +37,10 @@ specify
|
||||||
(posedge clk *> (q +: d)) = (3,1);
|
(posedge clk *> (q +: d)) = (3,1);
|
||||||
endspecify
|
endspecify
|
||||||
endmodule
|
endmodule
|
||||||
|
|
||||||
|
module test3(input clk, input [1:0] d, output [1:0] q);
|
||||||
|
specify
|
||||||
|
(posedge clk => (q +: d)) = (3,1);
|
||||||
|
(posedge clk *> (q +: d)) = (3,1);
|
||||||
|
endspecify
|
||||||
|
endmodule
|
||||||
|
|
Loading…
Reference in a new issue