Это блок-модуль...
module register_unit(data_out,data_in,load,clk,rst); parameter word_size=8; output [word_size-1:0] data_out; input [word_size-1:0] data_in; input load,clk,rst; reg data_out; always@(posedge clk or negedge rst) if(rst==0) data_out <= 0; else if(load) data_out <= data_in; endmodule
Это испытательный стенд
`include "register_unit.v" module test_bench(); parameter word_size=8; reg clk,rst,load; reg [word_size-1:0] data_in; wire [word_size-1:0] data_out; register_unit m1 (.data_out(data_out),.data_in(data_in),.load(load),.clk(clk),.rst(rst)); initial begin clk=0; forever begin #5 clk = ! clk; end end initial begin rst=0; data_out=8'b0; load=0; #10 rst=1; load=1; #10 data_out=8'b00000100; #10 data_out=8'b00000101; #20 load=0; end initial begin $dumpfile ("register_unit.vcd"); $dumpvars; end endmodule
Я компилирую этот код с помощью команды iverilog в Linux.
iverilog -o register_unit.v register_unit_tb.v
При компиляции кода выдает ошибку на порту data_out, говорит, что это недопустимое преобразование.
Ошибки заключаются в том, что data_out не является допустимым значением l в test_bench, а data_out объявлен здесь как wire.
Я получаю ошибки компиляции: data_out не является допустимым l-значением
Ответы (1)
Вы не можете присвоить значение wire
в блоке initial
. В блоке initial
вашего тестового стенда измените data_out
на data_in
:
initial
begin
rst=0;
data_in=8'b0;
load=0;
#10 rst=1;
load=1;
#10 data_in=8'b00000100;
#10 data_in=8'b00000101;
#20 load=0;
end
Я также получил предупреждение компилятора в register_unit
. Вы должны объявить reg
, используя битовую ширину:
reg [word_size-1:0] data_out;
person
toolic
schedule
07.03.2017
Предупреждение компилятора о
register_unit
также можно устранить, переключившись на заголовок в стиле ANSI. module register_unit #(parameter word_size=8) ( output reg [word_size-1:0] data_out, input [word_size-1:0] data_in, input load, clk, rst );
- person Greg; 07.03.2017