Interface 接口中RTL可读性的assign语句在合成中导致赋值或缓冲区
我们有一个与modports connectin gmodules的接口,看起来像这样:Interface 接口中RTL可读性的assign语句在合成中导致赋值或缓冲区,interface,system-verilog,synthesis,Interface,System Verilog,Synthesis,我们有一个与modports connectin gmodules的接口,看起来像这样: interface test_interface (clk, in1, out1); input logic in1; output logic out1; input logic clk; logic mid1; logic aliased_signal; modport a_to_b ( input in1, input
interface test_interface (clk, in1, out1);
input logic in1;
output logic out1;
input logic clk;
logic mid1;
logic aliased_signal;
modport a_to_b (
input in1,
input clk,
output mid1,
input aliased_signal
);
modport b_to_a (
input clk,
input mid1,
output out1,
output aliased_signal
);
endinterface : test_interface
module top(clock, inpad, outpad);
input logic clock;
input logic inpad;
output logic outpad;
test_interface test_if(.clk(clock), .in1(inpad), .out1(outpad));
a A0(.a2b(test_if));
b B0(.b2a(test_if));
endmodule
module a ( test_interface.a_to_b a2b);
always_ff @(posedge a2b.clk) begin
a2b.mid1 <= a2b.in1 & a2b.aliased_signal;
end
endmodule
module b (test_interface.b_to_a b2a);
assign b2a.aliased_signal = b2a.out1;
always_ff @(posedge b2a.clk) begin
b2a.out1 <= ~b2a.mid1;
end
endmodule
接口测试\u接口(时钟、输入1、输出1);
输入逻辑in1;
输出逻辑out1;
输入逻辑时钟;
逻辑mid1;
逻辑混叠信号;
移动端口a到b(
输入1,
输入时钟,
输出mid1,
输入混叠信号
);
莫德波特b_至a(
输入时钟,
输入mid1,
输出1,
输出混叠信号
);
endinterface:测试接口
模块顶部(时钟、输入、输出);
输入逻辑时钟;
输入逻辑inpad;
输出逻辑输出;
测试接口测试if(.clk(时钟),.in1(inpad),.out1(outpad));
a A0(.a2b(测试u-if));
b B0(.b2a(如果测试));
端模
模块a(测试接口a至a2b);
始终_ff@(posedge a2b.clk)开始
a2b.mid1 b连接正在进行),但如果我连接到mid2 a->c而不是直接使用模糊的_name信号,我会从IUS和DC收到相同的错误
interface test_interface(clk, in1, out1, out2);
input logic [7:0] in1;
output logic [3:0] out1;
output logic [3:0] out2;
input logic clk;
logic [7:0] obfuscated_name;
logic [3:0] mid1;
logic [3:0] mid2;
modport a_mp (
input clk,
input in1,
output obfuscated_name
);
modport a_to_b (
input clk,
input .mid1(obfuscated_name[3:0]),
output out1
);
modport a_to_c (
input clk,
input obfuscated_name,
output out2
);
endinterface : test_interface
module a ( test_interface.a_mp a_intf);
always_ff @(posedge a_intf.clk) begin
a_intf.obfuscated_name <= ~a_intf.in1;
end
endmodule
module b (test_interface.a_to_b b_intf);
always_ff @(posedge b_intf.clk) begin
b_intf.out1 <= b_intf.mid1;
end
endmodule
module c (test_interface.a_to_c c_intf);
always_ff @(posedge c_intf.clk) begin
c_intf.out2 <= ~c_intf.obfuscated_name[7:4];
end
endmodule
module top( input logic clock,
input logic [7:0] inpad,
output logic [3:0] outpad1,
output logic [3:0] outpad2 );
test_interface test_if(.clk(clock), .in1(inpad), .out1(outpad1), .out2(outpad2));
a A0(.a_intf(test_if));
b B0(.b_intf(test_if));
c C0(.c_intf(test_if));
endmodule
接口测试接口(时钟、输入1、输出1、输出2);
输入逻辑[7:0]输入1;
输出逻辑[3:0]out1;
输出逻辑[3:0]out2;
输入逻辑时钟;
逻辑[7:0]模糊的名称;
逻辑[3:0]mid1;
逻辑[3:0]mid2;
莫德波特酒店(
输入时钟,
输入1,
输出模糊的\u名称
);
移动端口a到b(
输入时钟,
input.mid1(模糊化的_名称[3:0]),
输出输出1
);
移动端口a_至c(
输入时钟,
输入模糊的_名称,
输出输出2
);
endinterface:测试接口
模块a(测试接口a\U mp a\U intf);
始终_ff@(posedge a_intf.clk)开始
a_intf.obfuscated_nameVerilog中有一个称为端口表达式的功能。_port的名称(expression_to_be_connected_to_port)
大多数人在他们没有意识到的模块实例端口列表中识别出来,也可以在模块减速端口列表头中使用。这声明了端口的名称以及连接到端口的表达式。这样,可以将较大内部总线的较小部分制作成端口
module DUT(input clk, inout .data(bus[7:0]) );
wire [31:0] bus;
endmodule
module top;
reg clock;
wire [7:0] mydata;
DUT d1(.data(mydata), .clk(clock) );
endmodule
在SystemVerilog中,您可以对modport表达式执行相同的操作
interface test_interface (clk, in1, out1);
input logic in1;
output logic out1;
input logic clk;
logic mid1;
logic aliased_signal;
modport a_to_b (
input in1,
input clk,
output mid1,
input .aliased_signal(out1) // modport expression
);
modport b_to_a (
input clk,
input mid1,
output out1
);
endinterface : test_interface
module top( input logic clock,
input logic inpad,
output logic outpad );
test_interface test_if(.clk(clock), .in1(inpad), .out1(outpad));
a A0(.a2b(test_if));
b B0(.b2a(test_if));
endmodule
module a ( test_interface.a_to_b a2b);
always_ff @(posedge a2b.clk) begin
a2b.mid1 <= a2b.in1 & a2b.aliased_signal; // port reference to alias
end
endmodule
module b (test_interface.b_to_a b2a);
always_ff @(posedge b2a.clk) begin
b2a.out1 <= ~b2a.mid1;
end
endmodule
接口测试\u接口(时钟、输入1、输出1);
输入逻辑in1;
输出逻辑out1;
输入逻辑时钟;
逻辑mid1;
逻辑混叠信号;
移动端口a到b(
输入1,
输入时钟,
输出mid1,
input.aliased_信号(out1)//modport表达式
);
莫德波特b_至a(
输入时钟,
输入mid1,
输出输出1
);
endinterface:测试接口
模块顶部(输入逻辑时钟,
输入逻辑inpad,
输出逻辑(outpad);
测试接口测试if(.clk(时钟),.in1(inpad),.out1(outpad));
a A0(.a2b(测试u-if));
b B0(.b2a(如果测试));
端模
模块a(测试接口a至a2b);
始终_ff@(posedge a2b.clk)开始
a2b.mid1抱歉,该网站是新用户,正在尝试在评论中显示更新的代码。我更新了原始问题,以包括我正在尝试的内容以及我从IUS和DC得到的错误(VCS似乎对此没有问题)。如果我使用信号的所有位,并将mid1设为8位而不是4位,IUS似乎对它满意:input.mid1(模糊的_名称),但我从DC得到相同的错误,最后,这是关于在合成中避免赋值/缓冲区。哎呀,我想我没有正确连接接口。IUS仍然不喜欢modport表达式.mid1(模糊的_名称[7:4]),因此部件选择不起作用,但一旦我正确连接接口,DC似乎就可以了!在ModelSim/Questa中工作