ncelab 中的错误:F*MISLUN:缺少顶层模块,设计单元名称
Error in ncelab: F*MISLUN: missing top level module, design unit name
我正在尝试实现一个可重新配置的模块,它根据用户设置更改其配置。在那里我会有一个巨大的 if else 梯子。当用户决定将位右移 4 位时,if else 条件阶梯中的所有值也应相应更改,用户不必手动更改每个值。一个核心变化就足以实现这一目标。
我已经开始先用函数尝试它,这就是为什么我还没有写完任何东西但遇到错误的原因。
您将在下面找到 rtl 和 tb。我需要两件事的帮助:
(1) 为什么我在 Cadence ncelab 软件中出现这个错误?
(2) 调整 "if ... else" 条件中存在的值的最佳方法是什么?因为我会有一个巨大的if else梯子。
RTL:
module function_trial (clk,value_in, value_out
);
input clk;
input value_in;
output value_out;
reg [31:0] value_in;
reg [31:0] c;
reg [31:0] value_out;
function [31:0] truncation; //The function truncates the last 4 lsbs
input [31:0] trunc_in;
begin
truncation = trunc_in >> 4;
end
endfunction
always @(value_in) begin
c = 32'h00000000;
if (value_in >= truncation(32'h08000000) && value_in < truncation(32'h0A000000)) begin
c = 32'h00000001;
end else if (value_in>= truncation(32'h0A000000) && value_in < truncation (32'h0C000000)) begin
c = 32'h00000002;
end
end
assign value_out=c;
endmodule
TB
`timescale 1ns/10ps
module tb_function_trial (
);
reg clk;
reg [ 31 : 0 ] value_in;
wire [ 31 : 0 ] value_out;
function_trial function_trial_i (
.clk(clk),
.value_in(value_in),
.value_out(value_out)
);
parameter CLKPERIODE = 20;
initial clk = 1'b1;
always #(CLKPERIODE/2) clk = !clk;
initial begin
value_in = 32'h00810000;
#10
value_in = 32'h00B00000;
#50 $finish();
end
`include "testcase.v"
endmodule
可能是我问的问题不对。如果您需要更多说明,请告诉我。
我发现代码中有两个错误。
reg [31:0] value_in;
是错误的,因为它是一个输入,而输入不能是 'reg' 类型。您必须将其更改为“wire”。
reg [31:0] value_out;
是错误的,因为您使用的是 'assign'。 assign 的目标必须是 wire 而不是 reg。这样一来也需要换成 `wire'。
我无法将这些错误类型与您标题中的错误消息相匹配。我怀疑这些错误阻止了模块的生成,这可能是您列出的错误消息的原因。在这种情况下,请检查别处是否有其他错误消息。
我正在尝试实现一个可重新配置的模块,它根据用户设置更改其配置。在那里我会有一个巨大的 if else 梯子。当用户决定将位右移 4 位时,if else 条件阶梯中的所有值也应相应更改,用户不必手动更改每个值。一个核心变化就足以实现这一目标。
我已经开始先用函数尝试它,这就是为什么我还没有写完任何东西但遇到错误的原因。
您将在下面找到 rtl 和 tb。我需要两件事的帮助:
(1) 为什么我在 Cadence ncelab 软件中出现这个错误? (2) 调整 "if ... else" 条件中存在的值的最佳方法是什么?因为我会有一个巨大的if else梯子。
RTL:
module function_trial (clk,value_in, value_out
);
input clk;
input value_in;
output value_out;
reg [31:0] value_in;
reg [31:0] c;
reg [31:0] value_out;
function [31:0] truncation; //The function truncates the last 4 lsbs
input [31:0] trunc_in;
begin
truncation = trunc_in >> 4;
end
endfunction
always @(value_in) begin
c = 32'h00000000;
if (value_in >= truncation(32'h08000000) && value_in < truncation(32'h0A000000)) begin
c = 32'h00000001;
end else if (value_in>= truncation(32'h0A000000) && value_in < truncation (32'h0C000000)) begin
c = 32'h00000002;
end
end
assign value_out=c;
endmodule
TB
`timescale 1ns/10ps
module tb_function_trial (
);
reg clk;
reg [ 31 : 0 ] value_in;
wire [ 31 : 0 ] value_out;
function_trial function_trial_i (
.clk(clk),
.value_in(value_in),
.value_out(value_out)
);
parameter CLKPERIODE = 20;
initial clk = 1'b1;
always #(CLKPERIODE/2) clk = !clk;
initial begin
value_in = 32'h00810000;
#10
value_in = 32'h00B00000;
#50 $finish();
end
`include "testcase.v"
endmodule
可能是我问的问题不对。如果您需要更多说明,请告诉我。
我发现代码中有两个错误。
reg [31:0] value_in;
是错误的,因为它是一个输入,而输入不能是 'reg' 类型。您必须将其更改为“wire”。
reg [31:0] value_out;
是错误的,因为您使用的是 'assign'。 assign 的目标必须是 wire 而不是 reg。这样一来也需要换成 `wire'。
我无法将这些错误类型与您标题中的错误消息相匹配。我怀疑这些错误阻止了模块的生成,这可能是您列出的错误消息的原因。在这种情况下,请检查别处是否有其他错误消息。