Ошибка: нет совпадения для вызова "модуля"
Я не могу инициализировать или позвонить full_adder
модуль для объединения нескольких full_adder
,
Getting error
error: no match for call to ‘(full_adder) (sc_core::sc_signal_in_if<sc_dt::sc_uint<4> >*, sc_core::sc_signal_in_if<sc_dt::sc_uint<4> >*, sc_core::sc_signal<bool, (sc_core::sc_writer_policy)0u>&, sc_core::sc_signal_inout_if<sc_dt::sc_uint<4> >*, sc_core::sc_signal<bool, (sc_core::sc_writer_policy)0u>&)’
(*fa0_ptr) (a[0],b[0], c0,sum[0],c0);
помощь очень ценится.
Вот мой пример кода.
full_adder.h
SC_MODULE(full_adder)
{
sc_in<bool> a,b, carry_in;
sc_out<bool> sum, carry_out;
sc_signal<bool> c1,s1,c2;
void prc_or();
contd.......
fourbit_adder.h
#include "full_adder.h"
SC_MODULE(fourbit_adder)
{
sc_in<sc_uint<4> > a,b;
sc_in<bool> carry_in;
sc_out<sc_uint<4> > sum;
sc_out<bool> carry_out;
sc_signal<bool> c0,c1,c2;
void prc_or();
full_adder *fa0_ptr, *fa1_ptr, *fa2_ptr, *fa3_ptr;
SC_CTOR(fourbit_adder)
{
fa0_ptr = new full_adder("fa0"); // constructor operator which allocates and initialize the memory.
//Positional association
(*fa0_ptr) (a[0],b[0], c0,sum[0],c0);
2 ответа
Во-первых, да, вы можете бросить int
в bool
но это не совсем ваша проблема. Вы пытаетесь соединить сигналы и порты (или интерфейсы и каналы) вместе. И хотя каналы несут int
а также bool
сами каналы имеют совершенно разные типы (например, sc_in<bool>
а также sc_signal< sc_int<99> >
несовместимых типов).
Самое простое решение - просто использовать промежуточный модуль для преобразования сигналов. То есть тот, который занимает sc_int<W>
и преобразует его в массив W логических сигналов (или наоборот). Я думаю, что вы можете искать это sc_int_bitref
класс, который может ссылаться немного с sc_int
или же sc_uint
,
Вот быстрый, но полностью рабочий пример. Шаблон класса UintToBits
модуль имеет один сигнал типа sc_uint
и массив bool
сигналы. Процесс модуля чувствителен к sc_uint
сигнал и обновляет все bool
сигналы при срабатывании. Вы можете довести это до n-й степени с помощью шаблонов классов (sc_int/sc_uint/sc_lv
и т.д.) но это просто простое решение, которое должно заставить вас работать.
шаблон SC_MODULE (UintToBits) {
typedef sc_uint<W> UintType; //type of sc_uint
sc_signal<UintType> uint_i; //input signal sc_uint
sc_signal<bool> bool_o[W]; //output signal W x bool
SC_CTOR(UintToBits){
SC_METHOD(proc); //setup conversion proc
sensitive << uint_i; //and kick it off when uint changes
}
void proc(){
UintType value = uint_i; //get the uint value
for(int i = 0; i < W; ++i){ //for each bit in uint
bool_o[i] = value[i]; //bool o/p sc_int_bitref[i]
}
}
};
Для демонстрации предположим, что у нас есть класс ниже, который принимает один бит ввода.
// Некоторый случайный модуль принимает один битовый вход SC_MODULE (ModuleBit) {
sc_in_clk clk_i; //just to make it go
sc_in<bool> bool_i; //bit input
SC_CTOR(ModuleBit){
SC_METHOD(proc); //a proc just to print out the bit
sensitive << clk_i.pos();
dont_initialize();
}
void proc(){ cout << bool_i; }
};
И этот блок, который выводит sc_uint
// Какой-то случайный модуль с данными sc_uint SC_MODULE (ModuleBitsW) {
sc_in_clk clk_i; //just to make it go
sc_out<UintType> uint_o; //the sc_uint
SC_CTOR(ModuleBitsW){
SC_METHOD(proc); //proc just to change the output
sensitive << clk_i.pos();
uint_o.initialize(0);
dont_initialize();
}
void proc(){
uint_o = uint_o->read() + 1; //output current value + 1
cout << '\n'; //emit nl to make seperate bool modules o/ps
}
};
Затем мы можем соединить их вместе с помощью модуля промежуточного преобразователя.
int sc_main (int, char **) {
const int W = 4; //Assume we have 4 bits
typedef UintToBits<W>::UintType UintType;
sc_clock clock("clock", 1.0, SC_SEC); //randomly chosen one second period clock
//create the sc_uint module, the bool modules and the converter module
UintToBits<W> convert("convert"); //converts sc_uint signal to W x bool signals
ModuleBitsW bitsw_m("bitsw_m"); //module with sc_uint output
ModuleBit* bit_m[W]; //W x modules needing single bit input
//connect the single bit modules
for(int i = 0; i < W; ++i){
bit_m[i] = new ModuleBit(("m" + to_string(i)).c_str());
bit_m[i]->bool_i(convert.bool_o[W-i-1]); //reverse them to print 'normally' (not guaranteed)
bit_m[i]->clk_i(clock);
}
bitsw_m.uint_o(convert.uint_i); //connect output of sc_uint module to converter module
bitsw_m.clk_i(clock); //just to drive it
sc_start(20.0, SC_SEC); //run it for 20 cycles and see what we get
return 0;
// пусть процесс очищает память, я слишком ленивый}
Который, когда я побежал, он дал вывод 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 0000 0001 0010 0011
Я использовал это включает в себя <systemc>, <iostream>
и импортировал эти пространства имен sc_core, sc_dt, std
и составлено с g++ -std=c++11 FullAdder.cpp -lsystemc
с gcc 4.9.2` на linux64
Это должно решить вашу проблему на данный момент, но если вы планируете делать много последовательных параллельных преобразований, это может стоить вам при разработке небольшого набора шаблонов (или, более вероятно, классов шаблонов-шаблонов). И, наконец, не забывайте, что очень полезно sc_int_bitref
вернулся из sc_int[]
оператор, но вам нужен сигнал (не только bool
или же int
) получать уведомления об изменениях для управления процессами.
Вы проходите sum[0]
в качестве 4-го аргумента в (*fa0_ptr) (a[0],b[0], c0,sum[0],c0)
который имеет тип sc_uint
но 4-й член full_adder
имеет тип bool
,